當所有請求都需要某個參數(shù)宠页,然而這個參數(shù)是通過異步接口獲取贾虽。導致并不能保證每個請求都是在獲取這個參數(shù)之后發(fā)起杆怕,這個時候我們就可以用reRequest來解決這個問題啦糠溜。
例子:小程序的userId需要通過傳給后端authCode才能獲取,我們所有的請求都需要帶上userId參數(shù)旁瘫。特別是用戶進入小程序的第一個頁面是不固定的時候祖凫,我們就很難保證userId在剛進入哪些頁面的時候是肯定已經(jīng)獲取了。面對這種情況時酬凳,我們可以通過多次請求來解決惠况。但是這不是最好的方案,這會增加請求次數(shù)宁仔,給服務器帶來壓力稠屠。對于這種情況,reRequest了解一下。
廢話不多說完箩,我們直接開擼:
const forceUrls = ['/getUser']; //強制請求url
let waitRequestArray = []; //等待開始的請求
let userId = '';
function ajax (url, method, params) {
return new Promise((resolve, reject) => {
if (!userId && !forceUrls.includes(url)) { //當前沒有userId赐俗,且當前請求不是強制請求
waitRequestArray.push({
url,
method,
params,
resolve,
reject,
});
} else {
return axios({
url,
method,
data: params,
}).then((res) => {
resolve(res);
}).catch((err) => {
reject(err);
})
}
})
}
這段代碼關鍵是在這里:
if (!userId && !forceUrls.includes(url)) { //當前沒有userId拉队,且當前請求不是強制請求
waitRequestArray.push({
url,
method,
params,
resolve,
reject,
});
}
當沒有userId弊知,并且請求不是強制請求時,將請求放入等待開始請求數(shù)組粱快。將Promise實例的resolve與reject也放入其中秩彤,且不運行。不運行resolve和reject就不會觸發(fā)Promise實例的then事哭、catch或者finally方法漫雷。
直到獲取到userId后,運行reRequest函數(shù)鳍咱,將等待開始的請求進行請求:
function reRequest () {
for (let item of waitRequestArray) {
const { url, method, params, resolve, reject, } = item;
ajax(url, method, params).then(resolve).catch(reject);
}
waitRequestArray = [];
}
因為這時userId已經(jīng)存在降盹,就不會再將重新發(fā)起的請求保存起來。而是發(fā)起請求谤辜,發(fā)起成功得到相應結果后將之前存儲的resolve或者reject傳入結果運行蓄坏,觸發(fā)Promise實例的then、catch或者finally方法丑念。
使用例子:
ajax('/getUser', 'get').then((result) => {
userId = result;
reRequest()
});
ajax('/getData', 'get').then((result) => {
console.log(result);
});
在調(diào)用getUser獲取userId以后涡戳,需要調(diào)用一次reRequest函數(shù),否則不會運行等待開始的請求脯倚。