如何使用对多个链接同时进行GET请求,依次获取返回结果的值进行条件判断?-灵析社区

楠楠不难难

Tampermonkey中使用GM_xmlhttpRequest对多个链接同时进行请求,将最先返回结果的值进行条件判断,要是符合条件不再获取后面的请求结果的值,要是不符合,依次获取第二个、第三个的返回结果的值进行条件判断,同样符合条件不再获取后面的,要是不符合条件,同样获取后面的值 使用AI写了一段代码,看注释和实际结果,貌似是先获取一个请求结果,进行判断,然后再等所有剩下的结果请求完成,再进行条件判断,并非依次等获取到请求结果就进行条件判断 const promises = []; // 要请求的链接列表 var urlavl = 'https://www.aaa.com'; var urlero = 'https://www.bbb.com'; var urlkuti = 'https://www.ccc.com'; var urls = [urlwiki,urlero,urlkuti]; // 遍历链接列表,发起请求并存储 Promise 和对应条件 urls.forEach((url) => { promises.push(new Promise((resolve, reject) => { GM_xmlhttpRequest({ method: "GET", url: url, onload: function(response) { let domNew = new DOMParser().parseFromString(response.responseText, 'text/html'); resolve(domNew); }, onerror: function(error) { resolve('请求错误' + url); } }); })); }); Promise.race(promises) .then((data) => { // 获取 response 和 condition // 判断第一个完成的请求是否满足对应条件 if(data.indexOf('#') > -1) { console.log(data); // 取消其他未完成的请求 (可选) promises.forEach(promise => { if (promise.cancel) { promise.cancel(); } }); } else { // console.log(`链接不满足条件,等待其他结果...`); // 使用 Promise.all() 等待所有请求完成 Promise.all(promises) .then(results => { // 遍历所有结果,查找满足对应条件的结果 console.log('重新查找') results.forEach((data) => { if(data.indexOf('#') > -1) { console.log(data); // console.log(`链接满足条件:`, response); } }); }) .catch(error => { console.error("请求出错:", error); }); } }) .catch(error => { console.error("请求出错:", error); });

阅读量:328

点赞量:12

问AI
你按照这个例子修改一下你那个请求就行 我这边为了调试 就用 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: any[]) { return new Promise((resolve) => { let i = 0; function nextRequest() { if (i === promises.length) { resolve('全部不符合条件') return; } const request = promises[i]() as Promise; 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); })