JavaScript实现指定数量并发限制的示例代码
本文介绍如何在JavaScript中限制异步操作的并发数量。通过数组分割、Promise.allSettled处理错误以及async/await控制执行顺序,实现指定数量的并发请求。代码示例展示了如何分割任务、封装请求处理函数及主函数逻辑,确保即使部分任务失败也能继续执行后续任务。
JavaScript并发限制实现概述
网上有这样一个题目:

这道题与之前讨论的时间分片(Time Slicing)有些相似,但区别在于这里需要限制异步操作的并发数量。
接下来直接看实现方式。
数组分割函数实现
首先,我们需要实现一个用于分割数组的函数。
const group = (list = [], max = 0) => {
if (!list.length) {
return list
}
let results = []
for (let i = 0, len = list.length; i < len; i += max) {
results.push(list.slice(i, i + max))
}
return results
}
该函数根据指定的并发数量对数组进行分割,主要使用 for 循环结合 slice 方法,实现逻辑较为简单。
请求集合封装与错误处理
接下来,我们使用 async 和 await 封装一个请求集合的处理函数。
通过 for...of 遍历每个异步函数,利用 async 和 await 确保函数的执行顺序,并使用 try...catch 保证即使 reject 报错,也不会影响后续任务的执行。
const requestHandler = async (
groupedUrl = [],
callback = () => { }
) => {
if (!groupedUrl.length) {
callback()
return groupedUrl
}
const newGroupedUrl = groupedUrl.map(fn => fn())
const resultsMapper = (results) => results.map(callback)
const data = await Promise.allSettled(newGroupedUrl).then(resultsMapper)
return data;
}
主函数与并发控制逻辑
接下来是主函数部分。
const sendRequest = async (
urls = [],
max = 0,
callback = () => { }
) => {
if (!urls.length) {
return urls
}
const groupedUrls = group(urls, max)
const results = []
console.log('start !')
for (let groupedUrl of groupedUrls) {
try {
const result = await requestHandler(groupedUrl, callback)
results.push(result)
console.log('go')
} catch { }
}
console.log('done !')
return results
}
这里利用 for 循环结合 async 和 await 来限制并发数量。每次并发任务完成后,再执行下一批任务。
示例运行与结果验证
我们运行一个示例:
const p1 = () => new Promise((resolve, reject) => setTimeout(reject, 1000, 'p1'))
const p2 = () => Promise.resolve(2)
const p3 = () => new Promise((resolve, reject) => setTimeout(resolve, 2000, 'p3'))
const p4 = () => Promise.resolve(4)
const p5 = () => new Promise((resolve, reject) => setTimeout(reject, 2000, 'p5'))
const p6 = () => Promise.resolve(6)
const p7 = () => new Promise((resolve, reject) => setTimeout(resolve, 1000, 'p7'))
const p8 = () => Promise.resolve(8)
const p9 = () => new Promise((resolve, reject) => setTimeout(reject, 1000, 'p9'))
const p10 = () => Promise.resolve(10)
const p11 = () => new Promise((resolve, reject) => setTimeout(resolve, 2000, 'p10'))
const p12 = () => Promise.resolve(12)
const p13 = () => new Promise((resolve, reject) => setTimeout(reject, 1000, 'p11'))
const p14 = () => Promise.resolve(14)
const ps = [p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14]
sendRequest(ps, 3, ({reason, value}) => {
console.log(reason || value)
})

可以看到,结果符合预期。
关于JavaScript实现指定数量并发限制的示例代码就介绍到这里,更多相关内容可搜索本站以前的文章或继续浏览下面的相关文章,希望大家以后多多支持本站!
5款主流JS在线运行工具对比:CodePen、JSFiddle与StackBlitz怎么选
2026-11-05 17:04:04
JavaScript入门书籍避坑:这些书不适合初学者
2026-11-05 16:31:15
JS使用Math.round实现保留两位小数的原理与代码
2026-11-05 15:35:55
JavaScript 原生 Date 对象怎么实现日期加减
2026-11-05 14:30:00
JavaScript函数定义的三种方式:声明、表达式与箭头函数
2026-11-05 13:50:55
