JavaScript实现指定数量并发限制的示例代码

作者:代码拾荒

时间:2026-10-23

浏览:104

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

文章目录

JavaScript并发限制实现概述

网上有这样一个题目:

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并发限制实现概述

可以看到,结果符合预期。

关于JavaScript实现指定数量并发限制的示例代码就介绍到这里,更多相关内容可搜索本站以前的文章或继续浏览下面的相关文章,希望大家以后多多支持本站!

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章