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 学习技巧
Feb 17 Javascript
如何将网页表格内容导入excel
Feb 18 Javascript
ExtJS 刷新后如何默认选中刷新前最后一次选中的节点
Apr 03 Javascript
Javascript的严格模式strict mode详细介绍
Jun 06 Javascript
js实现的二级横向菜单条实例
Aug 22 Javascript
jquery验证邮箱格式是否正确实例讲解
Nov 16 Javascript
vue.js事件处理器是什么
Mar 20 Javascript
使用Browserify来实现CommonJS的浏览器加载方法
May 14 Javascript
javascript+html5+css3自定义提示窗口
Jun 21 Javascript
element el-tree组件的动态加载、新增、更新节点的实现
Feb 27 Javascript
js如何验证密码强度
Mar 18 Javascript
JS字符串补全方法padStart()和padEnd()
May 27 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
如何分别全角和半角以避免乱码
2006/10/09 PHP
php中比较简单的导入phpmyadmin生成的sql文件的方法
2011/06/28 PHP
php判断终端是手机还是电脑访问网站的思路及代码
2013/04/24 PHP
浅析PHP程序防止ddos,dns,集群服务器攻击的解决办法
2013/06/18 PHP
PHP的mysqli_rollback()函数讲解
2019/01/23 PHP
PHP实现的支付宝支付功能示例
2019/03/26 PHP
jQuery-Easyui 1.2 实现多层菜单效果的代码
2012/01/13 Javascript
基于jquery的图片轮播 tab切换组件
2012/07/19 Javascript
javascript实现树形菜单的方法
2015/07/17 Javascript
jquery动态切换背景图片的简单实现方法
2016/05/14 Javascript
浅谈js中StringBuffer类的实现方法及使用
2016/09/02 Javascript
[03:39]2015国际邀请赛主赛事首日精彩回顾
2015/08/05 DOTA
使用python实现递归版汉诺塔示例(汉诺塔递归算法)
2014/04/08 Python
python 添加用户设置密码并发邮件给root用户
2016/07/25 Python
Python入门_浅谈数据结构的4种基本类型
2017/05/16 Python
python pandas获取csv指定行 列的操作方法
2019/07/12 Python
Django 拆分model和view的实现方法
2019/08/16 Python
关于Python中定制类的比较运算实例
2019/12/19 Python
python ssh 执行shell命令的示例
2020/09/29 Python
详解pandas赋值失败问题解决
2020/11/29 Python
python matplotlib工具栏源码探析二之添加、删除内置工具项的案例
2021/02/25 Python
CSS3 Media Queries(响应式布局可以让你定制不同的分辨率和设备)
2013/06/06 HTML / CSS
HTML5 本地存储和内容按需加载的思路和方法
2011/04/07 HTML / CSS
美国正宗设计师眼镜在线零售商:EYEZZ
2019/03/23 全球购物
软件测试常见笔试题
2012/02/04 面试题
促销活动策划方案
2014/01/12 职场文书
《小松树和大松树》教学反思
2014/02/20 职场文书
优秀护士获奖感言
2014/02/20 职场文书
个人社会实践自我鉴定
2014/03/24 职场文书
2013年最新自荐信范文
2014/06/23 职场文书
硕士生找工作求职信
2014/07/05 职场文书
公司委托书怎么写
2014/08/02 职场文书
2014年服装销售工作总结
2014/11/27 职场文书
五年级数学教学反思
2016/02/16 职场文书
Log4j.properties配置及其使用
2021/08/02 Java/Android
Redis 异步机制
2022/05/15 Redis