异步最大并发请求并按顺序组成结果
js
async function concurrentOrderedRequests(requests, maxConcurrent = 5) {
const results = new Array(requests.length); // 预定义结果数组
let currentIndex = 0; // 当前处理的任务索引
// 创建工作线程函数
async function worker() {
while (currentIndex < requests.length) {
const index = currentIndex++; // 原子性获取任务索引
const request = requests[index];
try {
results[index] = await request(); // 保持结果顺序的关键
} catch (error) {
results[index] = error; // 错误处理
}
}
}
// 创建并执行工作线程池
const workers = Array(Math.min(maxConcurrent, requests.length))
.fill().map(worker);
await Promise.all(workers); // 等待所有任务完成
return results;
}
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
js
// 模拟异步请求函数
const createRequest = (time, value) => () =>
new Promise(resolve =>
setTimeout(() => resolve(value), time)
);
// 创建测试请求队列
const requests = [
createRequest(3000, '请求1'),
createRequest(1000, '请求2'),
createRequest(2000, '请求3'),
createRequest(500, '请求4')
];
// 执行并获取结果
concurrentOrderedRequests(requests, 2)
.then(results => {
console.log('最终结果顺序:');
results.forEach((res, i) =>
console.log(`[请求${i+1}]`, res)
);
});
/* 输出(耗时约3秒):
最终结果顺序:
[请求1] 请求1
[请求2] 请求2
[请求3] 请求3
[请求4] 请求4
*/
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
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