小程序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次跳转的管理页
}
})