在 Tampermonkey 中如何高效處理多個異步請求并根據條件判斷控制請求的繼續或終止?

在 Tampermonkey 中如何高效處理多個異步請求并根據條件判斷控制請求的繼續或終止?

本文探討在Tampermonkey腳本中高效處理多個異步請求,并根據條件判斷控制請求的繼續或終止。 這在需要從多個URL獲取數據并基于數據進行決策的場景中非常實用。

問題描述: Tampermonkey腳本需要從多個URL獲取數據,并根據這些數據進行條件判斷。如果滿足特定條件,則停止后續請求;否則,繼續下一個請求。

挑戰: 直接使用gm_xmlhttpRequest的循環方法,會順序執行所有請求,無法在滿足條件后立即停止。

解決方案: 本文提供兩種方案,分別為順序請求和并發請求,都能在滿足條件后有效終止后續請求。

方案一:順序請求 (使用promise遞歸)

此方案依次發起請求,并在每個請求完成后進行條件判斷。如果條件滿足,則遞歸終止;否則,繼續下一個請求。

function promise1() { return new Promise(resolve => setTimeout(() => resolve({data: '123'}), 2000)); } function promise2() { return new Promise(resolve => setTimeout(() => resolve({data: '#234'}), 2000)); } function promise3() { return new Promise(resolve => setTimeout(() => resolve({data: '1'}), 2000)); }  function mainRequest(promises) {   return new Promise(resolve => {     let i = 0;     function nextRequest() {       if (i === promises.length) { resolve('全部不符合條件'); return; }       const request = promises[i]();       i++;       request.then(result => {         if (result.data.indexOf('#') > -1) { resolve(result.data); }         else { nextRequest(); }       }).catch(() => nextRequest()); // 處理錯誤     }     nextRequest();   }); }  mainRequest([promise3, promise2, promise1]).then(result => console.log('result', result));

方案二:并發請求 (使用Promise.all和條件判斷)

此方案同時發起所有請求,使用Promise.all等待所有請求完成。然后,遍歷結果進行條件判斷,找到第一個滿足條件的結果后停止后續處理。

function Promise1() { return new Promise(resolve => setTimeout(() => resolve({data: '#123'}), Math.random() * 1000)); } function Promise2() { return new Promise(resolve => setTimeout(() => resolve({data: '#234'}), Math.random() * 1000)); } function Promise3() { return new Promise(resolve => setTimeout(() => resolve({data: '#1'}), Math.random() * 1000)); }  function mainRequest(promises) {   return Promise.all(promises.map(p => p())).then(results => {     for (let i = 0; i < results.length; i++) {       if (results[i].data.indexOf('#') > -1) { return { successIndex: i, data: results[i].data }; }     }     return '未找到符合條件的請求';   }); }  mainRequest([Promise3, Promise2, Promise1]).then(result => console.log('result', result));

總結: 兩種方案都實現了在滿足條件后停止后續請求的目標。選擇哪種方案取決于具體需求:順序請求更節省資源,并發請求速度更快但消耗更多資源。 需要注意的是,gm_xmlhttpRequest本身不提供取消請求的功能,因此在并發方案中,我們通過在找到滿足條件的結果后忽略后續結果來實現“停止”的效果。 實際應用中,需要根據具體API和條件進行調整。

? 版權聲明
THE END
喜歡就支持一下吧
點贊11 分享