Tampermonkey中多個鏈接的并發(fā)GET請求及結(jié)果判斷
本文探討如何在Tampermonkey腳本中高效處理多個鏈接的GET請求,并根據(jù)返回結(jié)果進(jìn)行條件判斷。 目標(biāo)是:并發(fā)發(fā)起多個GET請求,一旦滿足條件,立即停止后續(xù)請求并返回結(jié)果。
由于GM_xmlhttpRequest缺乏原生取消請求機(jī)制,無法直接中斷已發(fā)起的請求。因此,我們將采用并發(fā)請求,并通過promise和Promise.race實現(xiàn)條件判斷和請求終止。
方案:并發(fā)請求與Promise.race
此方案同時發(fā)起所有GET請求,利用Promise.race找出第一個滿足條件的請求結(jié)果。
代碼示例:
function fetchUrl(url) { return new Promise((resolve, reject) => { GM_xmlhttpRequest({ method: "GET", url: url, onload: (response) => { resolve({ url: url, data: response.responseText }); }, onerror: (error) => { reject(error); } }); }); } async function main() { const urls = [ "https://example.com/1", "https://example.com/2", "https://example.com/3" ]; const promises = urls.map(url => fetchUrl(url)); try { const result = await Promise.race(promises); // 判斷結(jié)果是否滿足條件,例如: if (result.data.includes("success")) { console.log("條件滿足,結(jié)果:", result); return result; } else { console.log("第一個請求不滿足條件"); // 可在此處處理后續(xù)請求,或直接返回 return null; // or handle other results } } catch (error) { console.error("請求錯誤:", error); return null; } } main();
此代碼首先定義了一個fetchUrl函數(shù),使用GM_xmlhttpRequest發(fā)起GET請求并返回一個Promise。main函數(shù)則創(chuàng)建包含所有URL的Promise數(shù)組,使用Promise.race并發(fā)執(zhí)行這些Promise。Promise.race返回第一個完成的Promise的結(jié)果。 代碼中包含一個示例條件判斷(result.data.includes(“success”)),您可以根據(jù)實際需求修改。 如果第一個請求不滿足條件,則可以根據(jù)需要進(jìn)一步處理剩余的請求或直接返回。 錯誤處理也包含在try…catch塊中。
重要說明: 此方案雖然并發(fā)執(zhí)行,但仍依賴于網(wǎng)絡(luò)狀況。如果所有請求都耗時較長,則效率提升有限。 對于大量URL,考慮分批處理或更高級的并發(fā)控制策略。 請確保替換示例URL為您的實際鏈接。 此代碼需要Tampermonkey或類似用戶腳本管理器。