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 相关文章推荐
DB.ASP 用Javascript写ASP很灵活很好用很easy
Jul 31 Javascript
纯HTML5制作围住神经猫游戏-附源码下载
Aug 23 Javascript
详解AngularJS实现表单验证
Dec 10 Javascript
BootStrap 轮播插件(carousel)支持左右手势滑动的方法(三种)
Jul 07 Javascript
jQuery删除节点用法示例(remove方法)
Sep 08 Javascript
AngularJS验证信息框架的封装插件用法【w5cValidator扩展插件】
Nov 03 Javascript
JavaScript 实现 Tab 点击切换实例代码
Mar 25 Javascript
javascript中mouseenter与mouseover的异同
Jun 06 Javascript
React Native模块之Permissions权限申请的实例相机
Sep 28 Javascript
解决vue中使用swiper插件问题及swiper在vue中的用法
Apr 04 Javascript
微信小程序开发搜索功能实现(前端+后端+数据库)
Mar 04 Javascript
JS removeAttribute()方法实现删除元素的某个属性
Jan 11 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 飞信好友免费短信API接口开源版
2010/07/22 PHP
PHP连接Nginx服务器并解析Nginx日志的方法
2015/08/16 PHP
深入浅析PHP7.0新特征(五大新特征)
2015/10/29 PHP
PHP检测数据类型的几种方法(总结)
2017/03/04 PHP
原生JS实现Ajax通过POST方式与PHP进行交互的方法示例
2018/05/12 PHP
javascript中onmouse事件在div中失效问题的解决方法
2012/01/09 Javascript
jQuery实现 注册时选择阅读条款 左右移动
2013/04/11 Javascript
jQuery遍历Form示例代码
2013/09/03 Javascript
js获取IFRAME当前的URL的方法
2013/11/13 Javascript
javascript伸缩菜单栏实现代码分享
2015/11/12 Javascript
基于zepto的移动端轻量级日期插件--date_picker
2016/03/04 Javascript
angularJS 如何读写缓冲的方法(推荐)
2016/08/06 Javascript
JavaScript中三个等号和两个等号的区别(== 和 ===)浅析
2016/09/22 Javascript
JavaScript关联数组用法分析【概念、定义、遍历】
2017/03/15 Javascript
nodejs个人博客开发第六步 数据分页
2017/04/12 NodeJs
Vue单页式应用(Hash模式下)实现微信分享的实例
2017/07/21 Javascript
JS实现的抛物线运动效果示例
2018/01/30 Javascript
Vue2.0 事件的广播与接收(观察者模式)
2018/03/14 Javascript
React diff算法的实现示例
2018/04/20 Javascript
vue中post请求以a=a&b=b 的格式写遇到的问题
2018/04/27 Javascript
Angular 数据请求的实现方法
2018/05/07 Javascript
在angular 6中使用 less 的实例代码
2018/05/13 Javascript
原生js实现each方法实例代码详解
2019/05/27 Javascript
[01:09]DOTAPLUS——DOTA2的新时代
2018/04/04 DOTA
Django教程笔记之中间件middleware详解
2018/08/01 Python
pandas DataFrame 警告(SettingWithCopyWarning)的解决
2019/07/23 Python
关于Flask项目无法使用公网IP访问的解决方式
2019/11/19 Python
Anaconda+VSCode配置tensorflow开发环境的教程详解
2020/03/30 Python
python3中确保枚举值代码分析
2020/12/02 Python
Wiggle中国:英国骑行、跑步、游泳 & 铁三运动装备专卖网店
2016/08/02 全球购物
Java里面如何把一个Array数组转换成Collection, List
2013/07/26 面试题
音乐教学反思
2014/02/02 职场文书
集团公司党的群众路线教育实践活动工作总结
2014/03/03 职场文书
政风行风自查自纠报告
2014/10/21 职场文书
婚宴祝酒词大全
2015/08/10 职场文书
Android Studio实现简易进制转换计算器
2022/05/20 Java/Android