在使用Tampermonkey腳本時(shí),如何通過GM_xmlhttpRequest依次獲取多個(gè)鏈接的GET請求結(jié)果并進(jìn)行條件判斷?

在使用Tampermonkey腳本時(shí),如何通過GM_xmlhttpRequest依次獲取多個(gè)鏈接的GET請求結(jié)果并進(jìn)行條件判斷?

使用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。

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊14 分享