javascript - 在异步函数中运行并发 HTTP 请求

标签 javascript asynchronous

我正在做一个项目,它需要一个大致等同于以下的异步函数

async function task(url) {

    var r1 = await fetch(url).then(resp => resp.text());

    var r2 = await fetch(url + "/" + r1).then(resp => resp.json());

    //r2 is an array of urls

    var total = 0;
    for (var u of r2) {
        tmp = await fetch(u).then(resp => resp.text());
        total += parseInt(tmp)
    }
    return total
}

问题是 r2 中有数百个元素,每个元素都是一个 URL。如果我按顺序执行,此功能将花费很长时间才能完成。我想同时运行 10 个 URL(可以调整为其他数字),想知道我将如何重写异步函数。

最佳答案

将初始数组分成 10 个部分,然后等待每个 block 用 Promise.all 完成,然后再开始下一个:

async function getTotal(urlPart, subArr) {
  const resps = await Promise.all(subArr.map(url =>
    fetch(url).then(resp => resp.json())
  ))
  return resps.reduce((a, b) => a + b);
}

async function task(url) {
  const r1 = await fetch(url).then(resp => resp.text());
  const r2 = await fetch(url + "/" + r1).then(resp => resp.json());

  const chunks = [];
  const { length } = r2
  for (let i = 0; i < length; i += 10) {
    chunks.push(r2.slice(i, i + 10));
  }
  let total = 0;
  for (const subArr of chunks) {
    total += await getTotal(urlPart, subarr);
  }
  return total;
}

关于javascript - 在异步函数中运行并发 HTTP 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50997555/

相关文章:

javascript - 阅读更多 显示额外内容

javascript - 表单输入在焦点上显示隐藏默认值

c++ - 在一个线程中完成的操作对另一个线程可见,而无需显式同步

python - 我如何在 Flask 的回调中返回 HTTP 响应,或者这是否重要?

javascript - 如何在 Angular 中制作异步函数?

javascript - 将 onClick 与 jQuery POST 结合使用不起作用

javascript - 确认对话框后提交表单或取消提交

Javascript 变量意外未定义

JAVA/如何使用comletable-future进行异步回调?

asynchronous - 如何借用/避免在 tokio::spawn(async