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 相关文章推荐
javascript实现div浮动在网页最顶上并带关闭按钮效果实例
Aug 13 Javascript
jQuery 三击事件实现代码
Sep 11 Javascript
javascript操作excel生成报表示例
May 08 Javascript
jQuery验证插件validation使用指南
Apr 21 Javascript
JavaScript实现仿新浪微博大厅和腾讯微博首页滚动特效源码
Sep 15 Javascript
js表单提交和submit提交的区别实例分析
Dec 10 Javascript
jQuery实现简单的图片查看器
Sep 11 Javascript
jquery调整表格行tr上下顺序实例讲解
Jan 09 Javascript
js css+html实现简单的日历
Jul 14 Javascript
使用vue如何构建一个自动建站项目
Feb 05 Javascript
在vue.js中使用JSZip实现在前端解压文件的方法
Sep 05 Javascript
Koa日志中间件封装开发详解
Mar 09 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设计模式小结
2013/02/15 PHP
PHP开发框架laravel安装与配置教程
2015/03/13 PHP
深入浅出讲解:php的socket通信原理
2016/12/03 PHP
深入理解PHP中mt_rand()随机数的安全
2017/10/12 PHP
浅谈Laravel POST,PUT,PATCH 路由的区别
2019/10/15 PHP
jquery调用asp.net 页面后台的实现代码
2011/04/27 Javascript
js 判断一个元素是否在页面中存在
2012/12/27 Javascript
jQuery实现tag便签去重效果的方法
2015/01/20 Javascript
jQuery实现冻结表头的方法
2015/03/09 Javascript
jQuery使用before()和after()在元素前后添加内容的方法
2015/03/26 Javascript
jQuery基于ajax实现星星评论代码
2015/08/07 Javascript
js操作数据库实现注册和登陆的简单实例
2016/05/26 Javascript
JavaScript中定时控制Throttle、Debounce和Immediate详解
2016/11/17 Javascript
原生js和css实现图片轮播效果
2017/02/07 Javascript
Node.js Mongodb 密码特殊字符 @的解决方法
2017/04/11 Javascript
Axios学习笔记之使用方法教程
2017/07/21 Javascript
Angularjs添加排序查询功能的实例代码
2017/10/24 Javascript
vue完成项目后,打包成静态文件的方法
2018/09/03 Javascript
Javascript删除数组里的某个元素
2019/02/28 Javascript
js实现微信聊天效果
2020/08/09 Javascript
Vue+Element-U实现分页显示效果
2020/11/15 Javascript
Vue使用Ref跨层级获取组件的步骤
2021/01/25 Vue.js
[01:50:49]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Aster BO3 第三场 1月24日
2021/03/11 DOTA
Python学习笔记之抓取某只基金历史净值数据实战案例
2019/06/03 Python
简单了解Django ContentType内置组件
2019/07/23 Python
python实现TCP文件传输
2020/03/20 Python
北美个性化礼品商店:Things Remembered
2018/06/12 全球购物
美国探亲签证邀请信
2014/02/05 职场文书
俄语专业职业生涯规划
2014/02/26 职场文书
法律服务所工作总结
2015/08/10 职场文书
500字作文之难忘的同学
2019/12/20 职场文书
数据库连接池
2021/04/06 MySQL
python3使用diagrams绘制架构图的步骤
2021/04/08 Python
Golang 实现超大文件读取的两种方法
2021/04/27 Golang
CSS3实现的侧滑菜单
2021/04/27 HTML / CSS
Python可视化神器pyecharts绘制水球图
2022/07/07 Python