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 相关文章推荐
jquery 图片预加载 自动等比例缩放插件
Dec 25 Javascript
JavaScript 动态将数字金额转化为中文大写金额
May 14 Javascript
javascript 的Document属性和方法集合
Jan 25 Javascript
javascript 保存文件到本地实现方法
Nov 29 Javascript
jQuery的deferred对象详解
Nov 12 Javascript
jQuery实现商品活动倒计时
Oct 16 Javascript
jQuery+ajax+asp.net获取Json值的方法
Jun 08 Javascript
JavaScript中从setTimeout与setInterval到AJAX异步
Feb 13 Javascript
vue实现todolist单页面应用
Apr 11 Javascript
使用ThinkJs搭建微信中控服务的实现方法
Aug 08 Javascript
写给新手同学的vuex快速上手指北小结
Apr 14 Javascript
Vue全局使用less样式,组件使用全局样式文件中定义的变量操作
Oct 21 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实现WEB动态网页静态
2006/10/09 PHP
php zip文件解压类代码
2009/12/02 PHP
php中json_encode中文编码问题分析
2011/09/13 PHP
调试PHP程序的多种方法介绍
2014/11/06 PHP
php生成图片缩略图功能示例
2017/02/22 PHP
jquery BS,dialog控件自适应大小
2009/07/06 Javascript
子窗口、父窗口和Silverlight之间的相互调用
2010/08/16 Javascript
解析javascript中鼠标滚轮事件
2015/05/26 Javascript
jQuery实现下拉框功能实例代码
2016/05/06 Javascript
javascript中Date对象应用之简易日历实现
2016/07/12 Javascript
PHP捕捉异常中断的方法
2016/10/24 Javascript
Bootstrap中glyphicons-halflings-regular.woff字体报404错notfound的解决方法
2017/01/19 Javascript
基于Two.js实现星球环绕动画效果的示例
2017/11/06 Javascript
关于TypeScript模块导入的那些事
2018/06/12 Javascript
vue项目中使用Svg的方法
2018/10/24 Javascript
浅析JavaScript异步代码优化
2019/03/18 Javascript
微信小程序实现上传word、txt、Excel、PPT等文件功能
2019/05/23 Javascript
python基于urllib实现按照百度音乐分类下载mp3的方法
2015/05/25 Python
Python和JavaScript间代码转换的4个工具
2016/02/22 Python
Python中字符串的格式化方法小结
2016/05/03 Python
python append、extend与insert的区别
2016/10/13 Python
Django如何实现内容缓存示例详解
2017/09/24 Python
python障碍式期权定价公式
2019/07/19 Python
使用pytorch实现可视化中间层的结果
2019/12/30 Python
python 可视化库PyG2Plot的使用
2021/01/21 Python
国际知名设计师时装商店:Coggles
2016/09/05 全球购物
Java面试题:请说出如下代码的输出结果
2013/04/22 面试题
成人大专自我鉴定范文
2013/10/19 职场文书
经理秘书找工作求职信
2013/12/19 职场文书
学习心得体会
2014/01/01 职场文书
销售总监岗位职责
2014/01/04 职场文书
护士试用期自我鉴定
2014/02/08 职场文书
西双版纳导游词
2015/02/03 职场文书
永不妥协观后感
2015/06/10 职场文书
2016年植树节红领巾广播稿
2015/12/17 职场文书
员工给公司的建议书
2019/06/24 职场文书