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 相关文章推荐
ASP.NET jQuery 实例15 通过控件CustomValidator验证CheckBoxList
Feb 03 Javascript
extjs 时间范围选择自动判断的实现代码
Jun 24 Javascript
javascript实现的字符串与十六进制表示字符串相互转换方法
Jul 17 Javascript
原生JS实现左右箭头选择日期实例代码
Mar 14 Javascript
JavaScript数据结构之双向链表和双向循环链表的实现
Nov 28 Javascript
如何重置vue打印变量的显示方式
Dec 06 Javascript
微信小程序实现多选功能
Nov 04 Javascript
javascript中floor使用方法总结
Feb 02 Javascript
vue基础之使用get、post、jsonp实现交互功能示例
Mar 12 Javascript
JS实现排行榜文字向上滚动轮播效果
Nov 26 Javascript
前端深入理解Typescript泛型概念
Mar 09 Javascript
微信小程序绘制半圆(弧形)进度条
Nov 18 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 Parse Error: syntax error, unexpected $end 错误的解决办法
2012/06/05 PHP
smarty表格换行实例
2014/12/15 PHP
PHP使用MPDF类生成PDF的方法
2015/12/08 PHP
Laravel SQL语句记录方式(推荐)
2016/05/26 PHP
Laravel 创建可以传递参数 Console服务的例子
2019/10/14 PHP
关于laravel5.5的定时任务详解(demo)
2019/10/23 PHP
Domino中运用jQuery读取视图内容的方法
2009/10/21 Javascript
基于jQuery+HttpHandler实现图片裁剪效果代码(适用于论坛, SNS)
2011/09/02 Javascript
JavaScript 5 新增 Array 方法实现介绍
2012/02/06 Javascript
jquery 插件学习(五)
2012/08/06 Javascript
javascript获取网页中指定节点的父节点、子节点的方法小结
2013/04/24 Javascript
wap图片滚动特效无css3元素纯js脚本编写
2014/08/22 Javascript
JS是按值传递还是按引用传递
2015/01/30 Javascript
js实现拖拽效果
2015/02/12 Javascript
js实现带关闭按钮始终显示在网页最底部工具条的方法
2015/03/02 Javascript
基于JavaScript Array数组方法(新手必看篇)
2016/08/20 Javascript
JavaScript登录验证码的实现
2016/10/27 Javascript
Jquery uploadify 多余的Get请求(404错误)的解决方法
2017/01/26 Javascript
jquery实现图片上传前本地预览
2017/04/28 jQuery
图文详解vue框架安装步骤
2019/02/12 Javascript
详解Vue项目中实现锚点定位
2019/04/24 Javascript
通过vue刷新左侧菜单栏操作
2020/08/06 Javascript
javascript实现数字时钟效果
2021/02/06 Javascript
基于python的汉字转GBK码实现代码
2012/02/19 Python
Python中将字典转换为XML以及相关的命名空间解析
2015/10/15 Python
Python如何生成树形图案
2018/01/03 Python
Windows 7下Python Web环境搭建图文教程
2018/03/20 Python
Python的高阶函数用法实例分析
2019/04/11 Python
浅析python标准库中的glob
2020/03/13 Python
发现两个有趣的CSS3动画效果
2013/08/14 HTML / CSS
html5 音乐播放器 audio 标签使用概述
2013/07/15 HTML / CSS
祖国在我心中演讲稿
2014/01/15 职场文书
中学教师请假制度
2014/02/03 职场文书
《荷花》教学反思
2014/04/16 职场文书
党员廉洁自律个人总结
2015/02/13 职场文书
信息技术研修心得体会
2016/01/08 职场文书