小程序异步request请求的封装 

小程序request请求的封装 

request.js

var app = getApp();
//引入es6-promise处理接口异步,js文件github上通用
var Promise=require('es6-promise.js')
Promise.prototype.finally = function (callback) {
  var Promise = this.constructor;
  return this.then(
    function (value) {
      Promise.resolve(callback()).then(
        function () {
          return value;
        }
      );
    },
    function (reason) {
      Promise.resolve(callback()).then(
        function () {
          throw reason;
        }
      );
    }
  );
}
module.exports = (options) => {
  var me = app;
  var flag = false
  if (!options.noLoading) { // noLoading为true不显示请求的loading
//两种请求中的显示
    wx.showNavigationBarLoading();
    // wx.showLoading({
    //   title: '请求中',
    // })
  }
  return new Promise((resolve, reject) => {
    options = Object.assign(options,    
      {
        header: {
          'content-type': options.contentType ? options.contentType:'application/json', // 默认值,
          'X-Auth-Token': me.globalData.Cookie
        },
        success(result) {
          if (!options.noLoading) {
            wx.hideLoading()
            wx.hideNavigationBarLoading();
          }
          if (result.header['X-Auth-Token']){
            //做7天自动登录失效,不处理就是按后台报登录失效走401处理//不是很需要
            var token = result.header['X-Auth-Token']
            me.globalData.Cookie=token
            wx.setStorageSync('Cookie', token)
            var timestamp = Date.parse(new Date())
            var expiration = timestamp + 7*24*60*60*1000
            wx.setStorageSync("expiration", expiration)
          }
          if (result.data.code === 200) {
            me.globalData.flag401 = false
            resolve(result.data);
          } else {
            if(result.statusCode===401){ // 登录失效、未登录
            //flag401为防止401多次跳转登录页面,导致登录页叠加,在app.js给                                                                                    //    me.globalData.flag401初始值false
              if (!me.globalData.flag401) {
                me.globalData.flag401 = true
                  me.globalData.Cookie = ''
                  wx.setStorageSync('Cookie', null)
                  wx.setStorageSync("expiration", null)
                  wx.showToast({
                    title: '未登录',
                    icon: 'none',
                    image: '',
                    duration: 1000,
                    success: function () {
                      setTimeout(function () {
                        wx.navigateTo({
                          url: '/pages/login/login',
                        })
                      }, 1000)
                    }
                  })
                }
            } else { // console.log('接口请求错误:', options.noErroeMsg, !options.noErroeMsg)
              me.globalData.flag401 = false
              if (!options.noErroeMsg) { // noErroeMsg为true不显示请求的错误信息
                wx.showToast({
                  title: result.data.msg,
                  icon: 'none',
                  image: '',
                  duration: 3000
                })
              }
            }
            reject(result);
        }
      },

      fail: function (res) {
        me.globalData.flag401 = false
        wx.hideNavigationBarLoading();
        wx.hideLoading()
        if (!options.noFailMsg) { // noFailMsg为true不显示请求的错误信息
          if(res.errMsg==="request:fail timeout"){
            wx.showModal({
              title: '错误',
              content: '请求超时',
              showCancel:false
            })
          }else{
            wx.showModal({
              title: '错误',
              content: '请求失败',
              showCancel: false
            })
          }
        }
        reject(res);
        //console.log(".....fail.....");
      }
    });
    wx.request(options);
  });
};

app.js配置

//app.js

App({
  onLaunch: function () {
    var that = this

    // 展示本地存储能力
//这个和request7天请缓存对应
    var logs = wx.getStorageSync('logs') || []
    logs.unshift(Date.now())
    wx.setStorageSync('logs', logs)

    var expiration = wx.getStorageSync("expiration");//拿到过期时间
    var timestamp = Date.parse(new Date());//拿到现在时间

    this.globalData.Cookie = wx.getStorageSync('Cookie') ? wx.getStorageSync('Cookie') : null;

    if (expiration && expiration < timestamp) {//过期了,清空缓存,跳转到登录
      console.log("缓存已过期");
      wx.setStorageSync("expiration", null)//清空缓存
      wx.setStorageSync('Cookie', null)
      this.globalData.Cookie = null
      return
    }
  },
  onShow(options) {
    let that = this
    this.checkVersionUpdate()
  },

  // 检查版本更新
  checkVersionUpdate: function () {
    if (wx.canIUse('getUpdateManager')) {
      const updateManager = wx.getUpdateManager()
      updateManager.onCheckForUpdate(function (res) {
        console.log('检查版本更新:', res.hasUpdate)
        if (res.hasUpdate) {
          updateManager.onUpdateReady(function () {
            wx.showModal({
              title: '更新提示',
              content: '新版本已经准备好,是否重启应用?',
              success: function (res) {
                if (res.confirm) {
                  updateManager.applyUpdate()
                }
              }
            })
          })
          updateManager.onUpdateFailed(function () {
            wx.showModal({
              title: '已经有新版本了哟~',
              content: '新版本已经上线,请您删除当前小程序,重新搜索打开。'
            })
          })
        }
      })
    } else {
      wx.showModal({
        title: '提示',
        content: '当前微信版本过低,无法使用该功能,请升级到最新微信版本后重试。'
      })
    }
  },

  // 比较版本号,解决兼容性
  compareVersion: function(v1, v2) {
    v1 = v1.split('.')
    v2 = v2.split('.')
    const len = Math.max(v1.length, v2.length)
    while(v1.length <len) {
      v1.push('0')
    }
    while(v2.length <len) {
      v2.push('0')
    }
    for(let i = 0; i<len; i++) {
      const num1 = parseInt(v1[i])
      const num2 = parseInt(v2[i])
      if (num1 > num2) {
        return 1
      } else if (num1 < num2) {
        return -1
      }
    }
    return 0
  },

  globalData: {
//需要用的全局变量
    token: null,
    Cookie: null,
    flag401: false // 是否出现过401,防zhi次跳转的管理页
  }
})

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值