本文探討在Tampermonkey腳本中高效處理多個異步請求,并根據條件判斷控制請求的繼續或終止。 這在需要從多個URL獲取數據并基于數據進行決策的場景中非常實用。
問題描述: Tampermonkey腳本需要從多個URL獲取數據,并根據這些數據進行條件判斷。如果滿足特定條件,則停止后續請求;否則,繼續下一個請求。
挑戰: 直接使用gm_xmlhttpRequest的循環方法,會順序執行所有請求,無法在滿足條件后立即停止。
解決方案: 本文提供兩種方案,分別為順序請求和并發請求,都能在滿足條件后有效終止后續請求。
此方案依次發起請求,并在每個請求完成后進行條件判斷。如果條件滿足,則遞歸終止;否則,繼續下一個請求。
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