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 相关文章推荐
JSON 客户端和服务器端的格式转换
Aug 27 Javascript
浅谈JavaScript函数参数的可修改性问题
Dec 05 Javascript
javascript实现验证IP地址等相关信息代码
May 10 Javascript
jQuery实现鼠标双击Table单元格变成文本框及输入内容后更新到数据库的方法
Nov 25 Javascript
javascript中的try catch异常捕获机制用法分析
Dec 14 Javascript
vue中配置mint-ui报css错误问题的解决方法
Oct 11 Javascript
详解Vue结合后台的列表增删改案例
Aug 21 Javascript
vue element upload组件 file-list的动态绑定实现
Oct 11 Javascript
使用 JavaScript 创建并下载文件(模拟点击)
Oct 25 Javascript
ES6中Promise的使用方法实例总结
Feb 18 Javascript
JS面向对象编程基础篇(一) 对象和构造函数实例详解
Mar 03 Javascript
javascript利用canvas实现鼠标拖拽功能
Jul 23 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跨时区(UTC时间)应用解决方案
2013/01/11 PHP
PHP发送短信代码分享
2015/08/11 PHP
PHP测试成功的邮件发送案例
2015/10/26 PHP
PHP的全局错误处理详解
2016/04/25 PHP
Thinkphp5.0 框架实现控制器向视图view赋值及视图view取值操作示例
2019/10/12 PHP
PHP vsprintf()函数格式化字符串操作原理解析
2020/07/14 PHP
纯HTML5制作围住神经猫游戏-附源码下载
2015/08/23 Javascript
JS+CSS实现简易的滑动门效果代码
2015/09/24 Javascript
JS控制静态页面之间传递参数获取参数并应用的简单实例
2016/08/10 Javascript
最常见和最有用的字符串相关的方法详解
2017/02/06 Javascript
jQuery使用正则验证15/18身份证的方法示例
2017/04/27 jQuery
bootstrap table单元格新增行并编辑
2017/05/19 Javascript
JS中offset和匀速动画详解
2018/02/06 Javascript
vue轮播图插件vue-concise-slider的使用
2018/03/13 Javascript
jQuery实现图片简单轮播功能示例
2018/08/13 jQuery
详解Vue底部导航栏组件
2019/05/02 Javascript
Vue项目中使用WebUploader实现文件上传的方法
2019/07/21 Javascript
微信小程序tabBar 返回tabBar不刷新页面
2019/07/25 Javascript
jQuery操作事件完整实例分析
2020/01/10 jQuery
node.js基于dgram数据报模块创建UDP服务器和客户端操作示例
2020/02/12 Javascript
微信小程序弹窗禁止页面滚动的实现代码
2020/12/30 Javascript
python将人民币转换大写的脚本代码
2013/02/10 Python
python使用分治法实现求解最大值的方法
2015/05/12 Python
python 读取.csv文件数据到数组(矩阵)的实例讲解
2018/06/14 Python
不到20行代码用Python做一个智能聊天机器人
2019/04/19 Python
使用python3批量下载rbsp数据的示例代码
2019/12/20 Python
运动服饰每月订阅盒:Ellie
2018/04/29 全球购物
广州御银科技股份有限公司试卷(C++)
2016/11/04 面试题
桥梁与隧道工程专业本科生求职信
2013/10/08 职场文书
ktv中秋节活动方案
2014/01/30 职场文书
《燕子》教学反思
2014/02/18 职场文书
亚运会口号
2014/06/20 职场文书
班级读书活动总结
2014/06/30 职场文书
解除租房协议书
2014/12/03 职场文书
《狮子和鹿》教学反思
2016/02/16 职场文书
宫崎骏十大动画电影,宫崎骏好看的动画电影排名
2022/03/22 日漫