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跨浏览器显示的file上传控件
Oct 24 Javascript
javascript窗口宽高,鼠标位置,滚动高度(详细解析)
Nov 18 Javascript
js交换排序 冒泡排序算法(Javascript版)
Oct 04 Javascript
AspNet中使用JQuery上传插件Uploadify详解
May 20 Javascript
jQuery验证插件validate使用方法详解
Sep 13 Javascript
快速入门Vue
Dec 19 Javascript
微信小程序动态显示项目倒计时效果
Jun 13 Javascript
jQuery实现的文字逐行向上间歇滚动效果示例
Sep 06 jQuery
JS实现标签滚动切换效果
Dec 25 Javascript
JavaScript事件冒泡与事件捕获实例分析
Aug 01 Javascript
微信小程序HTTP接口请求封装的实现
Feb 21 Javascript
JS轻量级函数式编程实现XDM三
Jun 16 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邮件发送,php发送邮件的类
2011/03/24 PHP
php 伪造本地文件包含漏洞的代码
2011/11/03 PHP
解析Extjs与php数据交互(增删查改)
2013/06/25 PHP
简单谈谈PHP中的include、include_once、require以及require_once语句
2016/04/23 PHP
PHP实现模拟http请求的方法分析
2017/12/20 PHP
PHP count()函数讲解
2019/02/03 PHP
Laravel如何同时连接多个数据库详解
2019/08/13 PHP
PhpStorm 如何优雅的调试Hyperf的方法步骤
2019/11/24 PHP
实现连缀调用的map方法(prototype)
2009/08/05 Javascript
cnblogs 代码高亮显示后的代码复制问题解决实现代码
2011/12/14 Javascript
js控制div弹出层实现方法
2015/05/11 Javascript
javascript使用Promise对象实现异步编程
2016/03/01 Javascript
如何正确理解javascript的模块化
2017/03/02 Javascript
微信小程序 input输入及动态设置按钮的实现
2017/10/27 Javascript
Angular中点击li标签实现更改颜色的核心代码
2017/12/08 Javascript
jQuery实现文件编码成base64并通过AJAX上传的方法
2018/04/12 jQuery
Angular5集成eventbus的示例代码
2018/07/19 Javascript
基于html+css+js实现简易计算器代码实例
2020/02/28 Javascript
在NodeJs中使用node-schedule增加定时器任务的方法
2020/06/08 NodeJs
[53:13]DOTA2-DPC中国联赛 正赛 DLG vs PHOENIX BO3 第三场 1月18日
2021/03/11 DOTA
python range实例用法分享
2020/02/06 Python
关于探究python中sys.argv时遇到的问题详解
2021/02/23 Python
德国化妆品和天然化妆品网上商店:kosmetikfuchs.de
2017/06/09 全球购物
简述数组与指针的区别
2014/01/02 面试题
完美实现CSS垂直居中的11种方法
2021/03/27 HTML / CSS
中专毕业生自我鉴定范文
2013/11/09 职场文书
门卫岗位职责
2013/11/15 职场文书
计划生育标语
2014/06/23 职场文书
党的群众路线教育实践活动批评与自我批评发言稿
2014/10/16 职场文书
学习心理学的体会
2014/11/07 职场文书
员工辞职信范文
2015/03/02 职场文书
结婚通知短信大全
2015/04/17 职场文书
先进工作者主要事迹材料
2015/11/03 职场文书
2016年春节问候语
2015/11/11 职场文书
学校体育节班级口号
2015/12/25 职场文书
SpringRetry重试框架的具体使用
2021/07/25 Java/Android