[探索] 利用promise做一个请求锁
生活随笔
收集整理的這篇文章主要介紹了
[探索] 利用promise做一个请求锁
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
在最近開發(fā)小程序的過程中,遇到一個需求,就是請求的時候header需要帶上accessToken, accessToken是通過登陸接口返回的參數(shù),可能會出現(xiàn)過期的情況,則需要重新登陸,所以每次加載小程序都會進行一次本地儲存的accessToken校驗,但是再小程序的運行機制下,app的onLaunch,加載pages的onLoad會并發(fā)執(zhí)行,在弱網(wǎng)的情況下,并發(fā)可能導致accessToken還沒校驗完,page的請求函數(shù)就開始執(zhí)行了,這樣很容易會導致接口異常,本來的解決辦法是在每個page頁面調接口之前都await一下app.js里面checkAccessToken的方法,但是這樣寫起來不太友好
解決思路:
在request的基礎上封裝多一層鎖,當accessToekn校驗完成之前,其他進來的請求都進行等待,不進行請求,等待校驗完成,才開始其他請求
原理分析
代碼分析
首先模擬一次請求
// 模擬一次請求發(fā)起 const mockRequest = (name, time = Math.random() * 1000) =>new Promise(reslove => {console.log(`${name}---------------run`);setTimeout(() => {reslove(`${name}---------------done`);}, time);});定義請求鎖
請求鎖要管理兩種狀態(tài),一種是關鍵請求進行是狀態(tài),一種是當關鍵請求失敗了之后,需要等待輔助操作完成的狀態(tài)
const lock = { wait: null, runing: null };在request的基礎上加一層封裝
模擬運行效果
// 并發(fā)請求模擬 const mockConcurrent = () => {for (let i = 0; i < 5; i ) {setTimeout(() => {request(`并發(fā)請求${i}`, { withOutLock: i === 0 });}, Math.random() * 100);} };request("關鍵請求 - 其他需要等待完成才能進行", {lockOthers: true,hasErr: false });mockConcurrent();運行時效果
最后
經過同事的指點,未來還打算探究一下請求池,做請求上下文之類的實現(xiàn)
demo代碼: 具體例子代碼demo參考
純技術探索,坑點未知,歡迎指出錯誤以及不足的地方
總結
以上是生活随笔為你收集整理的[探索] 利用promise做一个请求锁的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何在 vue-cli v3.0 中使用
- 下一篇: 自己写了一个多行文本溢出文字补全的小库,