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 相关文章推荐
百度Popup.js弹出框进化版 拖拽小框架发布 兼容IE6/7/8,Firefox,Chrome
Apr 13 Javascript
避免回车键导致的页面无意义刷新的解决方法
Apr 12 Javascript
IE8中使用javascript动态加载CSS的解决方法
Jun 17 Javascript
javascript操作表格排序实例分析
May 06 Javascript
基于Bootstrap里面的Button dropdown打造自定义select
May 30 Javascript
JS实现页面载入时随机显示图片效果
Sep 07 Javascript
js复制内容到剪贴板代码,js复制代码的简单实例
Oct 27 Javascript
jQuery EasyUi 验证功能实例解析
Jan 06 Javascript
vue2.0实现导航菜单切换效果
May 08 Javascript
浅谈vuejs实现数据驱动视图原理
Feb 23 Javascript
微信小程序获取公众号文章列表及显示文章的示例代码
Mar 10 Javascript
vue.js click点击事件获取当前元素对象的操作
Aug 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获取搜索引擎关键字来源的函数(支持百度和谷歌等搜索引擎)
2012/10/03 PHP
PHP判断json格式是否正确的实现代码
2017/09/20 PHP
javascript 闭包
2011/09/15 Javascript
asp.net网站开发中用jquery实现滚动浏览器滚动条加载数据(类似于腾讯微博)
2012/03/14 Javascript
面向对象继承实例(a如何继承b问题)(自写)
2013/07/01 Javascript
javascript学习笔记(八)正则表达式
2014/10/08 Javascript
深入理解JavaScript系列(35):设计模式之迭代器模式详解
2015/03/03 Javascript
js实现文字向上轮播功能
2017/01/13 Javascript
jQuery操作css样式
2017/05/15 jQuery
javascript 开发之百度地图使用到的js函数整理
2017/05/19 Javascript
JS全角与半角转化实例(分享)
2017/07/04 Javascript
10 种最常见的 Javascript 错误(频率最高)
2018/02/08 Javascript
vue自定义一个v-model的实现代码
2018/06/21 Javascript
layer弹出层取消遮罩的方法
2019/09/25 Javascript
vue中使用百度脑图kityminder-core二次开发的实现
2019/09/26 Javascript
解决vuex改变了state的值,但是页面没有更新的问题
2020/11/12 Javascript
[52:14]VG vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
Python fileinput模块使用实例
2015/06/03 Python
学习python 之编写简单乘法运算题
2016/02/27 Python
利用pyinstaller或virtualenv将python程序打包详解
2017/03/22 Python
python密码错误三次锁定(实例讲解)
2017/11/14 Python
Python3中条件控制、循环与函数的简易教程
2017/11/21 Python
简述Python2与Python3的不同点
2018/01/21 Python
python实现大转盘抽奖效果
2019/01/22 Python
pytorch载入预训练模型后,实现训练指定层
2020/01/06 Python
Python爬虫headers处理及网络超时问题解决方案
2020/06/19 Python
python3.8动态人脸识别的实现示例
2020/09/21 Python
伊莱克斯(Electrolux)俄罗斯网上商店:瑞典家用电器品牌
2021/01/23 全球购物
学校消防演习方案
2014/02/19 职场文书
2014学校庆三八妇女节活动总结
2014/03/01 职场文书
2014年项目工作总结
2014/11/24 职场文书
租车协议书
2015/01/27 职场文书
史上最牛的辞职信
2015/02/28 职场文书
2015年银行柜员工作总结报告
2015/04/01 职场文书
2019大学生暑期实习心得总结
2019/08/21 职场文书
Python手拉手教你爬取贝壳房源数据的实战教程
2021/05/21 Python