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