欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Vue Promise的axios请求封装详解

程序员文章站 2022-06-11 18:18:21
现在应该大部分公司都是前后端分离了。so,数据请求的封装还是必须的。 为了实现向ios中block封装请求的异步的效果,我采用javascript中promise这个对象...

现在应该大部分公司都是前后端分离了。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, '请求失败')
        })

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