使用Tampermonkey腳本,如何利用GM_xmlhttpRequest依次發(fā)起多個(gè)GET請求,并根據(jù)返回結(jié)果進(jìn)行條件判斷,是一個(gè)常見問題。關(guān)鍵在于:獲取單個(gè)請求結(jié)果后立即判斷,滿足條件則停止后續(xù)請求,否則繼續(xù)下一個(gè)。 之前的方案往往在所有請求完成后才進(jìn)行判斷,效率低下。
本文提供兩種改進(jìn)方案:
方法一:依次請求,逐個(gè)判斷
此方法保證每個(gè)請求完成后立即判斷,滿足條件則結(jié)束。可以使用遞歸或迭代實(shí)現(xiàn)。以下示例使用模擬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); }); } async function mainRequest(promises) { for (const promise of promises) { const result = await promise(); if (result.data.indexOf('#') > -1) { return result.data; } } return '全部不符合條件'; } mainRequest([promise3, promise2, promise1]).then(result => { console.log('result:', result); });
優(yōu)點(diǎn):避免不必要的請求;缺點(diǎn):每個(gè)請求串行執(zhí)行,總時(shí)間較長。
方法二:并發(fā)請求,立即判斷
此方法同時(shí)發(fā)起所有請求,但立即判斷結(jié)果。 效率更高,但GM_xmlhttpRequest不支持取消請求,只能忽略后續(xù)結(jié)果。以下為簡化示例:
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); }); } async function mainRequest(promises) { const results = await Promise.all(promises.map(p => p())); for (let i = 0; i < results.length; i++) { if (results[i].data.indexOf('#') > -1) { return { successIndex: i, data: results[i].data }; } } return '未找到符合條件的請求'; } mainRequest([Promise1, Promise2, Promise3]).then(result => { console.log('result:', result); });
優(yōu)點(diǎn):更快找到符合條件的結(jié)果;缺點(diǎn):無法取消已發(fā)出的請求,可能造成資源浪費(fèi)。
選擇哪種方法取決于具體需求。 如果請求數(shù)量較少,且每個(gè)請求時(shí)間較長,方法一更合適;如果請求數(shù)量較多,且每個(gè)請求時(shí)間較短,方法二效率更高,但需要權(quán)衡資源消耗。 實(shí)際應(yīng)用中,需將模擬Promise替換為GM_xmlhttpRequest。