vue axios 简单封装以及思考


Posted in Javascript onOctober 09, 2018

axios 简介

axios 是一个基于Promise 用于浏览器和 nodejs 的 HTTP 客户端,它本身具有以下特征:

--------------------------------------------------------------------------------
•从浏览器中创建 XMLHttpRequest
•从 node.js 发出 http 请求
•支持 Promise API
•拦截请求和响应
•转换请求和响应数据
•取消请求
•自动转换JSON数据
•客户端支持防止 CSRF/XSRF

先安装 axios

npm install axios

axios的详细介绍以及用法 就不多说了请 移步 github ➡️  https://github.com/axios/axios

下面是简单的封装一个 http.js, 在此说明  checkStatus 这个方法呢 是不一定需要的 ,根据个人的项目需求吧,也可以直接返回response,交给后面另行处理也行。

或者根据后端返回的状态,在里面进行处理 也行。

"use strict";
import axios from "axios";
import qs from "qs";
//添加请求拦截器
axios.interceptors.request.use(
 config => {
  return config;
 },
 error => {
  return Promise.reject(error);
 }
);
//添加响应拦截器
axios.interceptors.response.use(
 response => {
  return response;
 },
 error => {
  return Promise.resolve(error.response);
 }
);
axios.defaults.baseURL = "https://www.xxxx/api";
axios.defaults.headers.post["Content-Type"] = "application/json";
axios.defaults.headers.post["X-Requested-With"] = "XMLHttpRequest";
axios.defaults.timeout = 10000;
function checkStatus(response) {
 return new Promise((resolve, reject) => {
  if (
   response &&
   (response.status === 200 ||
    response.status === 304 ||
    response.status === 400)
  ) {
   resolve(response.data);
  } else {
   reject({
    state: "0",
    message: "网络异常"
   });
  }
 });
}
export default {
 post(url, params) {
  return axios({
   method: "post",
   url,
   data: params
  }).then(response => {
   return checkStatus(response);
  });
 },
 get(url, params) {
  params = qs.stringify(params);
  return axios({
   method: "get",
   url,
   params
  }).then(response => {
   return checkStatus(response);
  });
 }
};

在vue 项目中,main.js这个文件

import http from "./utils/http";
Vue.prototype.$http = http;

使用 helloworld.vue

...
methods: {
  async TestPost() {
   try {
    const res = await this.$http.post("/message/socketid", {
     account: "huangenai"
    });
    console.log(res);
   } catch (error) {
    console.log(error);
   }
  },
  async TestGet() {
   this.$http
    .get("/price")
    .then(res => {
     console.log(res);
    })
    .catch(error => {
     alert(error);
    });
  }
}
....

在main.js中将http.js import 进来 并暴露到全局使用,在任何vue 页面中 就不再需要 import http.js了,而直接通过 this.$http.post this.$http.get 来使用,在checkStatus中统一异步返回,顺便可以处理错误的情况。

个人思考:

checkStatus方法 返回了一个 Promise

链式结构的话看上面那个get的方法,this.$http.get(...).then(...).catch(...),如果then 里面又来一个 http请求 会一层包住一层。

如果使用了语法糖 async  await  ,虽然 看起来好像是简单了 不用 一层包住一层 层层嵌套,可是你必须要用到 try catch,如果出现异常 则直接到catch,不会再执行下面到方法。如果再实际业务中,就算出现了某一个http请求失败到情况,不影响下面的逻辑要继续跑下去呢,这个就不适用了。链式结构也是 如果catch到异常 也不会执行then 里面到方法了。

所以,是否把返回的Promise,全部都返回的是 resolve,那么 就不会说出现直接到了 catch 里面不执行以下的业务了逻辑了呢。而且如果使用了语法糖 await 代码看起来更加简洁 也不需要 try catch了, 这样的话 reject是不是就不需要用到了呢。

function checkStatus(response) {
 return new Promise(resolve => {
  if (
   response &&
   (response.status === 200 ||
    response.status === 304 ||
    response.status === 400)
  ) {
   resolve(response.data);
  } else {
   resolve({
    state: "0",
    message: "网络异常"
   });
  }
 });
}

个人觉得这两种方案各有优劣,实际应用中还是应该根据个人业务需求 业务情况而定。

Javascript 相关文章推荐
一个简单的JavaScript 日期计算算法
Sep 11 Javascript
jQuery提交表单ajax查询实例代码
Oct 07 Javascript
Extjs改变树节点的勾选状态点击按钮将复选框去掉
Nov 14 Javascript
完美兼容各大浏览器获取HTTP_REFERER方法总结
Jun 24 Javascript
javaScript中Math()函数注意事项
Jun 18 Javascript
纯js实现无限空间大小的本地存储
Jun 18 Javascript
详解基于javascript实现的苹果系统底部菜单
Dec 02 Javascript
完美实现js选项卡切换效果(一)
Mar 08 Javascript
浅谈Express异步进化史
Sep 09 Javascript
基于datepicker定义自己的angular时间组件的示例
Mar 14 Javascript
layui实现根据table数据判断按钮显示情况的方法
Sep 26 Javascript
Three.js实现雪糕地球的使用示例详解
Jul 07 Javascript
angularJS实现不同视图同步刷新详解
Oct 09 #Javascript
对angular 实时更新模板视图的方法$apply详解
Oct 09 #Javascript
AngularJs返回前一页面时刷新一次前面页面的方法
Oct 09 #Javascript
详解js模板引擎art template数组渲染的方法
Oct 09 #Javascript
angular4强制刷新视图的方法
Oct 09 #Javascript
Angular4.x Event (DOM事件和自定义事件详解)
Oct 09 #Javascript
Vue官方推荐AJAX组件axios.js使用方法详解与API
Oct 09 #Javascript
You might like
php socket方式提交的post详解
2008/07/19 PHP
通过ifame指向的页面高度调整iframe的高度
2006/10/05 Javascript
定义select的边框颜色
2008/04/28 Javascript
JavaScript 函数参数是传值(byVal)还是传址(byRef) 分享
2013/07/02 Javascript
Javascript中常见的校验如域名、手机、邮箱等等
2014/01/02 Javascript
js变量、作用域及内存详解
2014/09/23 Javascript
javascript面向对象快速入门实例
2015/01/13 Javascript
js结合正则实现国内手机号段校验
2015/06/19 Javascript
原生javascript实现分享到朋友圈功能 支持ios和android
2016/05/11 Javascript
jQuery回调方法使用示例
2017/06/26 jQuery
vue-quill-editor实现图片上传功能
2017/08/08 Javascript
JS设计模式之数据访问对象模式的实例讲解
2017/09/30 Javascript
vue自定义switch开关组件,实现样式可自行更改
2019/11/01 Javascript
jQuery实现颜色打字机的完整代码
2020/03/19 jQuery
基于JS实现table导出Excel并保留样式
2020/05/19 Javascript
vue+iview实现分页及查询功能
2020/11/17 Vue.js
[01:08]DOTA2次级职业联赛 - Shield战队宣传片
2014/12/01 DOTA
python 循环while和for in简单实例
2016/08/16 Python
python opencv之SURF算法示例
2018/02/24 Python
Python向Excel中插入图片的简单实现方法
2018/04/24 Python
Python学习笔记之While循环用法分析
2019/08/14 Python
大家都说好用的Python命令行库click的使用
2019/11/07 Python
python 命名规范知识点汇总
2020/02/14 Python
jupyter实现重新加载模块
2020/04/16 Python
css3图片边框border-image的用法
2017/06/30 HTML / CSS
英国高街奥特莱斯:Highstreet Outlet
2019/11/21 全球购物
Linux如何为某个操作添加别名
2013/03/01 面试题
优秀员工年终发言演讲稿
2014/01/01 职场文书
护理专科毕业生自荐书范文
2014/02/19 职场文书
俄语专业职业生涯规划
2014/02/26 职场文书
2014教师研修学习体会
2014/07/08 职场文书
运动会广播稿50字-100字
2014/10/11 职场文书
2014年房产经纪人工作总结
2014/12/08 职场文书
2019学校请假条格式及范文
2019/06/25 职场文书
古诗之感恩老师
2019/10/24 职场文书
Pycharm连接远程服务器并远程调试的全过程
2021/06/24 Python