Vue Promise的axios请求封装详解


Posted in Javascript onAugust 13, 2018

现在应该大部分公司都是前后端分离了。so,数据请求的封装还是必须的。

为了实现向ios中block封装请求的异步的效果,我采用JavaScript中promise这个对象。

var p1 = New promise((resolve,reject)=>{
 var timeOut = Math.random() * 2;
  log('set timeout to: ' + timeOut + ' seconds.');
  setTimeout(function () {
    if (timeOut < 1) {
      log('call resolve()...');
      resolve('200 OK');
    }
    else {
      log('call reject()...');
      reject('timeout in ' + timeOut + ' seconds.');
    }
  }, timeOut * 1000);
})

其中resolve,reject就相当于是你定义了两个block,然后把数据传出去。

继续往下看,紧接着上面的代码

var p2 = p1.then(function (result) {  //resolve 导出的数据
  console.log('成功:' + result);
});
var p3 = p2.catch(function (reason) { //reject 导出的数据
  console.log('失败:' + reason);
});

通过查阅资料还发现另外两种用法,Promise.all 和 Promise.race这两种。

var p1 = new Promise(function (resolve, reject) {
  setTimeout(resolve, 500, 'P1');
});
var p2 = new Promise(function (resolve, reject) {
  setTimeout(resolve, 600, 'P2');
});
// 同时执行p1和p2,并在它们都完成后执行then:
Promise.all([p1, p2]).then(function (results) {
  console.log(results); // 获得一个Array: ['P1', 'P2']
});

这一种是p1 和 p2 都返回了数据,才会执行all后面的then函数。挺像ios中GCD的notify函数

第二种

var p1 = new Promise(function (resolve, reject) {
  setTimeout(resolve, 500, 'P1');
});
var p2 = new Promise(function (resolve, reject) {
  setTimeout(resolve, 600, 'P2');
});
Promise.race([p1, p2]).then(function (result) {
  console.log(result); // 'P1'
});

race跑步的意思,看谁跑得快,跑得慢的就被摒弃掉了。

上面这些是封装的基础,下面来看具体应用#

基于axios的请求封装

//判断请求环境来区分链接 生产环境和测试环境
const ajaxUrl = env === 'development' ? 
  'https://www.baidu.com' :
  env === 'production' ?
  'https://www.baidu.com' :
  'https://www.baidu.com';

util.ajax = axios.create({
  baseURL: ajaxUrl,
  timeout: 30000
});
// options中包含着数据
export function axiosfetch(options) {
  
  return new Promise((resolve, reject) => {
    var token = window.localStorage.getItem('token') ? window.localStorage.getItem('token') : "";
    var cid = window.localStorage.getItem('X-CID') ? window.localStorage.getItem('X-CID') : "";
    // var language = window.localStorage.getItem('language') ? window.localStorage.getItem('language') : "";
    
    var language = tools.getCookie('language')?tools.getCookie('language'): navigator.language;
    language = language == "en-US" ? "en" : language ;
    debug.log(language)
    var params = tools.deepClone(options.params);//深拷贝
    var sign_str = tools.sign(params); //签名
    const instance = axios.create({
      baseURL: ajaxUrl,
      timeout: 30000,
      //instance创建一个axios实例,可以自定义配置,可在 axios文档中查看详情
      //所有的请求都会带上这些配置,比如全局都要用的身份信息等。
      headers: { //所需的信息放到header头中
        // 'Content-Type': 'application/json',
        "Authorization": token,
        "X-CID":cid,
        "X-LOCALE":language,
        "X-SIGN":sign_str
      },
      // timeout: 30 * 1000 //30秒超时
    });
    
    let httpDefaultOpts = { //http默认配置
      method:options.method,
      url: options.url,
      timeout: 600000,
      params:Object.assign(params),
      data:qs.stringify(Object.assign(params)),
      // headers: options.method=='get'?{
      //   'X-Requested-With': 'XMLHttpRequest',
      //   "Accept": "application/json",
      //   "Content-Type": "application/json; charset=UTF-8",
      //   "Authorization": token
      // }:{
      //   'X-Requested-With': 'XMLHttpRequest',
      //   'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
      //   "Authorization": token
      // }
    }

    if(options.method=='get'){ //判断是get请求还是post请求
      delete httpDefaultOpts.data
    }else{
      delete httpDefaultOpts.params
    }
    instance(httpDefaultOpts)
      .then(response => {//then 请求成功之后进行什么操作
        debug.log('参数:')
        debug.log(options.params)
        debug.log('响应:')
        debug.log(response)
        debug.log(response.data.errno)
        if(response.data.errno == 401){
          // alert(response.data.errmsg)
          // window.location.href = window.location.protocol + "//" +window.location.host + '/#/login'
          return
        }
        if(response.data.errno == 400){
          reject(response)
          return
        }
        resolve(response)//把请求到的数据发到引用请求的地方
      })
      .catch(error => {
        // console.log('请求异常信息=>:' + options.params + '\n' + '响应' + error)
        debug.log('请求异常信息=>:' + options.params + '\n' + '响应' + error)
        reject(error)
      })
  })
}

外面再包一层

export function getNodeDetailInfo(address) {
  return axiosfetch({
    url:api.nodeDetailAPI,//链接
    method:"get",//get请求
    params:{//数据
      address:address
    }
  })
}

再下面就是实际应用。

getNodeDetailInfo(address).then(res => {
          var data = res.data.data;
        }).catch(error => {
          console.log(error, '请求失败')
        })

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
取键盘键位ASCII码的网页
Jul 30 Javascript
Jquery ThickBox插件使用心得(不建议使用)
Sep 08 Javascript
Vue.JS入门教程之自定义指令
Dec 08 Javascript
jquery Banner轮播选项卡
Dec 26 Javascript
js实现华丽的九九乘法表效果
Mar 29 Javascript
浅谈angularJS的$watch失效问题的解决方案
Aug 11 Javascript
JavaScript动态绑定详解
Sep 14 Javascript
Angular5中调用第三方js插件的方法
Feb 26 Javascript
Vue中如何实现proxy代理
Apr 20 Javascript
React Hooks的深入理解与使用
Nov 12 Javascript
解决vue一个页面中复用同一个echarts组件的问题
Jul 19 Javascript
vue中可编辑树状表格的实现代码
Oct 31 Javascript
Angular6封装http请求的步骤详解
Aug 13 #Javascript
解决angularjs中同步执行http请求的方法
Aug 13 #Javascript
解决angularjs前后端分离调用接口传递中文时中文乱码的问题
Aug 13 #Javascript
AngularJS使用$http配置对象方式与服务端交互方法
Aug 13 #Javascript
angularjs $http调用接口的方式详解
Aug 13 #Javascript
Javascript格式化并高亮xml字符串的方法及注意事项
Aug 13 #Javascript
vue实现文件上传功能
Aug 13 #Javascript
You might like
php下intval()和(int)转换使用与区别
2008/07/18 PHP
初学CAKEPHP 基础教程
2009/11/02 PHP
浅析PHP substr,mb_substr以及mb_strcut的区别和用法
2013/06/21 PHP
PHP+jquery+ajax实现即时聊天功能实例
2014/12/23 PHP
19个Android常用工具类汇总
2014/12/30 PHP
Codeigniter发送邮件的方法
2015/03/19 PHP
深入解析PHP的Laravel框架中的event事件操作
2016/03/21 PHP
一个简单的php路由类
2016/05/29 PHP
PHPCMS2008广告模板SQL注入漏洞修复
2016/10/11 PHP
Javascript中正则表达式的全局匹配模式分析
2011/04/26 Javascript
微信开发 微信授权详解
2016/10/21 Javascript
Jquery树插件zTree实现菜单树
2017/01/24 Javascript
js实现简易垂直滚动条
2017/02/22 Javascript
JavaScript结合HTML DOM实现联动菜单
2017/04/05 Javascript
微信小程序实现tab和swiper切换结合效果
2020/07/17 Javascript
vue项目中使用ueditor的实例讲解
2018/03/05 Javascript
JS+CSS实现过渡特效
2021/01/02 Javascript
[46:55]LGD vs Liquid 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
回调函数的意义以及python实现实例
2017/06/20 Python
python基于ID3思想的决策树
2018/01/03 Python
Django框架的中的setting.py文件说明详解
2018/10/15 Python
利用pyuic5将ui文件转换为py文件的方法
2019/06/19 Python
python实现图片转换成素描和漫画格式
2020/08/19 Python
传统HTML页面实现模块化加载的方法
2018/10/15 HTML / CSS
分享全球十款超强HTML5开发工具
2014/05/14 HTML / CSS
购买澳大利亚最好的服装和内衣在线:BONDS
2016/10/14 全球购物
Theory美国官网:后现代都市风时装品牌
2018/05/09 全球购物
办公室主任职责范文
2013/11/08 职场文书
应届生自荐信范文
2014/02/21 职场文书
中共广东省委常委会党的群众路线教育实践活动整改方案
2014/09/23 职场文书
承诺保证书格式
2015/02/28 职场文书
2015教师个人工作总结范文
2015/03/31 职场文书
2016秋季田径运动会广播稿
2015/12/21 职场文书
简单谈谈Python面向对象的相关知识
2021/06/28 Python
python元组打包和解包过程详解
2021/08/02 Python
Mysql分库分表之后主键处理的几种方法
2022/02/15 MySQL