100个请求,如何使用Promise控制并发

JavaScript 中可以通过 Promise.all()、Promise.race()、async/await 等不同方式来实现对异步并发任务的控制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
1、Promise.all()

const urls = ["url1", "url2", ... ,"url100"];

const maxConcurrentNum = 10; // 最大并发数
// 数组分块,chunk 表示每批次数量,返回数组二维数组
function chunk(arr, chunk) {
let result = [];
for (let i = 0, len = arr.length; i < len; i += chunk) {
result.push(arr.slice(i, i + chunk));
}
return result;
}

// 异步请求方法
function fetchUrl(url) {
return new Promise((resolve, reject) => {
fetch(url)
.then(res => resolve(res))
.catch(err => reject(err));
});
}

// 对 url 数组进行分块处理
const chunkedUrls = chunk(urls, maxConcurrentNum);

(async function () {
try {
for (let urls of chunkedUrls) {
const promises = urls.map(url => fetchUrl(url));
// 等待所有 promises 完成执行,并将结果存入 results 数组中
const results = await Promise.all(promises);
console.log('results:', results);
}
} catch (err) {
console.error(err);
}
})();
###以上代码通过将数组分成多个数目相等的小数组,每次最多只开启maxConcurrentNum个并发请求,以此来控制并发数量。每当一组请求完成后再发送新的一批请求,可以实现对异步任务的并发控制。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2Promise.race()
const promiselist = [];
for (let i = 0; i < 100; i++) {
const promise = fetch(`https://example.com/data${i}.json`);
promiselist.push(promise);
}
Promise.race(promiselist)
.then(response => {
// handle the fastest response here
})
.catch(error => {
console.error(error);
});

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
3async/await
async function getData() {
const promiselist = [];
for (let i = 0; i < 100; i++) {
const promise = fetch(`https://example.com/data${i}.json`);
promiselist.push(promise);
}
const responses = await Promise.all(promiselist);
for (const response of responses) {
// handle each response here
}
}

getData().catch(error => {
console.error(error);
});
###在上面的代码中,我们首先创建了一个async函数,并在该函数中使用for循环来发送所有的请求,并将每个请求的Promise对象存储在一个数组中。 然后,我们使用await关键字来异步等待所有Promise对象都被解决,并将解决值存储在一个数组中。 最后,我们在处理每个响应时对数组进行迭代。

4、
还有一些第三方库可以使用,例如 async.js 和 p-limit 等。p-limit 是一个专门用于控制 Promise 并发的小型库。可以在 p-limit 文档中找到更多信息和示例。


100个请求,如何使用Promise控制并发
http://example.com/2023/07/03/100个请求,如何使用Promise控制并发/
作者
dinghw
发布于
2023年7月3日
许可协议