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 相关文章推荐
一段利用WSH获取登录时间的jscript代码
May 11 Javascript
jquery动态增加text元素以及删除文本内容实例代码
Jul 01 Javascript
判断ie的两种简单方法
Aug 12 Javascript
举例说明如何为JavaScript的方法参数设置默认值
Nov 17 Javascript
基于d3.js实现实时刷新的折线图
Aug 03 Javascript
jQuery实现的简单拖动层示例
Feb 22 Javascript
VUE中的无限循环代码解析
Sep 22 Javascript
如何使用webpack打包一个库library的方法步骤
Dec 18 Javascript
小程序自定义模板实现吸顶功能
Jan 08 Javascript
JavaScript实现指定数量的并发限制的示例代码
Mar 10 Javascript
vue 如何从单页应用改造成多页应用
Oct 23 Javascript
详解Vue的sync修饰符
May 15 Vue.js
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
定制404错误页面,并发信给管理员的程序
2006/10/09 PHP
PHP实现事件机制实例分析
2015/06/26 PHP
alixixi runcode.asp的代码不错的应用
2007/08/08 Javascript
De facto standard 世界上不可思议的事实标准
2010/08/29 Javascript
Google (Local) Search API的简单使用介绍
2013/11/28 Javascript
javascript中style.left和offsetLeft的用法说明
2014/03/07 Javascript
javascript字符串循环匹配实例分析
2015/07/17 Javascript
javascript模拟C#格式化字符串
2015/08/26 Javascript
使用Chart.js图表库制作漂亮的响应式表单
2015/10/28 Javascript
基于jQuery实现仿搜狐辩论投票动画代码(附源码下载)
2016/02/18 Javascript
jQuery查找节点并获取节点属性的方法
2016/09/09 Javascript
关于使用axios的一些心得技巧分享
2017/07/02 Javascript
在react-router4中进行代码拆分的方法(基于webpack)
2018/03/08 Javascript
Angular PWA使用的Demo示例
2019/01/31 Javascript
vue中axios的二次封装实例讲解
2019/10/14 Javascript
vue和iview实现Scroll 数据无限滚动功能
2019/10/31 Javascript
jQuery实现鼠标滑动切换图片
2020/05/27 jQuery
[56:58]VP vs Optic 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python实现在sqlite动态创建表的方法
2015/05/08 Python
使用Python对IP进行转换的一些操作技巧小结
2015/11/09 Python
对Python+opencv将图片生成视频的实例详解
2019/01/08 Python
实例介绍Python中整型
2019/02/11 Python
解决python tkinter界面卡死的问题
2019/07/17 Python
基于keras 模型、结构、权重保存的实现
2020/01/24 Python
python3代码中实现加法重载的实例
2020/12/03 Python
澳大利亚最大的网上油画销售画廊:Direct Art Australia
2018/04/15 全球购物
意大利拉斐尔时尚购物网:Raffaello Network(支持中文)
2018/11/09 全球购物
高中三年学习生活的自我评价
2013/10/10 职场文书
励志演讲稿500字
2014/08/21 职场文书
临时租车协议范本
2014/09/23 职场文书
爱护环境卫生倡议书
2015/04/29 职场文书
2015年小学重阳节活动总结
2015/07/29 职场文书
2016年党员公开承诺书范文
2016/03/24 职场文书
mysql事务对效率的影响分析总结
2021/10/24 MySQL
Java并发编程之原子性-Atomic的使用
2022/03/16 Java/Android
python读取mat文件生成h5文件的实现
2022/07/15 Python