2021-02-01

import {md5} from './md5.js'
// wx.setStorageSync('istoken', true);
let baseUrl = 'https://'
const request=({
	url = '',
	data = '',
	type = 'json',
	callback = '',
	...other
} = {})=>{
	// wx.showLoading({
	// 	title: '请求中...',
	// })
	// console.log(url,data,type,'进入请求')
	let timeStart = Date.now();
	getNewToken()
	return new Promise((resolve, reject) => {
		let signstr = md5(JSON.stringify(data) + getApp().globalData.dev_key)
		let sign = {
			dev_id: getApp().globalData.dev_id,
			sign: signstr,
			access_token: wx.getStorageSync('token')
		};
		// console.log(data, 'data', )
		// console.log(sign, 'sign')
		wx.request({
			url: baseUrl + url,
			data: {
				request: data,
				sign: sign
			},
			header: {
				'content-type': 'application/json',
			},
			...other,
			success: function(res) {
				if (res.statusCode == 200) {
					resolve(res.data)
				}
			},
			complete: res => {
				// wx.hideLoading();
				// console.log(`耗时${Date.now() - timeStart}`);

				//重新请求完token,再次执行后的请求在这里拦截
				if (callback) {
					callback(res.data);
					return
				}
				if (res.statusCode >= 200 && res.statusCode < 300) {
					// token过期
					if (res.data.code == 10004) {
						// console.log('token过期111')
						// 	console.log(url,data,type,'token过期')
						checkStatus(url ,
							data,
							type,
							callback ).then(res => {
							resolve(res)
						})
						// wx.setStorageSync('istoken', false)
					}
				} else {
					reject(res);
				}

			}
		})
	})

}
const getNewToken = () => {
	// let nowtime = Number(Math.round(new Date().getTime() / 1000).toString())
	// if (wx.getStorageSync('endtime') <= nowtime) {
		return new Promise((resolve, reject) => {
			let request = {
				dev_id: getApp().globalData.dev_id,
				dev_key: getApp().globalData.dev_key
			};
			let signstr = md5(JSON.stringify(request) + getApp().globalData.dev_key)
			let sign = {
				dev_id: getApp().globalData.dev_id,
				sign: signstr,
			}
			wx.request({
				url: baseUrl + '/api/token/get_myself',
				method: "POST",
				header: {
					'content-type': 'application/json' // 默认值
				},
				data: {
					request: request,
					sign: sign
				},
				method: 'post',
				success: function(res) {
					if (res.statusCode == 200 && res.data.code == 0) {
						// console.log(res.data.data.end_time, 1111)
						wx.setStorageSync('token', res.data.data.access_token);
						wx.setStorageSync('endtime', res.data.data.end_time);
						//执行缓存中的请求
						onAccessTokenFetched()
						//延迟几秒再将刷新token的开关放开,不然偶尔还是会重复提交刷新token的请求
						setTimeout(() => {
							isRefreshing = true
						}, 3000)
						resolve(res)
					} else {
						// if (res.data.status_code == 403) {
						//   wx.navigateTo({
						//     url: '/pages/loginIn/loginIn',
						//   })
						// }
					}
				},
			})
		})

	// }
}

//获取token
const getToken = () => {
	let token = wx.getStorageSync('token') || '';
	return token;
}
let isRefreshing = true;

function checkStatus(url ,data,type,callback) {
	// 刷新token的函数,这需要添加一个开关,防止重复请求
	// console.log(url,data,type,'检查状态')
	if (isRefreshing) {
		getNewToken()
	}
	isRefreshing = false;
	// 将token刷新成功后的回调请求缓存
	const retryOriginalRequest = new Promise((resolve) => {
		addSubscriber(() => {
				console.log(url,data,type,'准备发起请求')
				console.log(request(url,
				data,
				type ,
				callback ),'准备发起请求111')
			resolve(request(url,
				data,
				type ,
				callback ))
		})
	});
	return retryOriginalRequest;
}
let subscribers = [];

function onAccessTokenFetched() {
	subscribers.forEach((callback) => {
		callback()
	})
	subscribers = [];
}

function addSubscriber(callback) {
	subscribers.push(callback)
}
module.exports = {
	request
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值