我正在做一个项目,它需要一个大致等同于以下的异步函数
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/