当前位置: 首页 > 知识库问答 >
问题:

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

咸浩初
2024-09-11

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);
    });

共有2个答案

费凯康
2024-09-11
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);

})
秦俊友
2024-09-11

这个链接可能存在安全风险,为了保护您的设备和数据安全,请避免访问此链接。

 类似资料:
  • 问题内容: 我正在尝试执行上述程序,但为同一程序提供了不同的值。对于给定的字符串执行多次时,是否有任何方法可以获取相同的字节? 问题答案: 在这里,您不打印a的值。正如owlstead在注释中正确指出的那样,将在字节数组上调用Object.toString()方法。导致这种格式的输出: 如果要打印数组中的每个元素,则必须遍历它。 甚至更简单,请使用以下方法:

  • 是否可以在webclient上将多个请求链接在一起?例如,我希望在进行交易时能够更新买方和卖方的余额。现在它只更新买家余额: 是否有一种方法可以将两个put方法调用在一起,以便更新两个余额? 更新:此方法适用于将单声道值作为uri变量调用。

  • 我有以下实体: 我还有一个Spring数据JPA存储库,定义如下: 当我从存储库中执行find-method时,我想急切地加载TextRow。因此,我在上面的代码中引入了NamedEntityGraph-和EntityGraph-注释。 在数据库的文本表中有2个条目,在文本行表中各有3个条目。 我希望findAllByBelongsTo方法返回一个包含两个文本实例的列表。相反,它返回一个包含6个文

  • 我想在多个字段上进行日期直方图/范围聚合,并将结果存储在其他集合/索引中。因此,我可以在小时范围内使用查询/聚合使doc_count和。 聚合如下: 结果不出所料: 假设我解析了响应,并尝试将结果存储在其他索引/集合中。 存储聚合结果的最佳方式是什么,这样我就可以进行其他查询/聚合,以求和不同小时范围之间的“doc_count”? 例如:在“2016-07-17t00:00.000z”-“2016

  • 问题内容: 假设有一个函数,应该执行一个HTTP请求并将其用于该请求。 如果在循环中调用if ,我希望下一个请求是在上一个完成之后执行的(串行执行,一个接一个)。为了不使回调和Promises混乱,我想使用async / await模式(与Babel.js一起编译以与Node 6+一起运行)。 但是,我不清楚如何等待响应对象进行进一步处理,以及如何作为以下结果返回它: 如果我使用 mocha 为H

  • 我正在尝试使用FastAPI构建一个web应用程序。 启动web应用程序并将此URL输入web浏览器后: 该应用程序将返回一个实例的预测(例如,一个65岁的女性客户,收入38K,支出35K) 如何修改上述 URL 以查询两个观察结果,例如:收入为 38K 且花费 35K 的 65 岁女性客户和收入为 40K 且花费 37K 的 50 岁男性客户?