为了实现异步任务的并发控制,确保在最多 max 个任务同时进行的情况下,一个任务完成后立即有另一个任务接上,需求:
思路:
-
任务计数器: 维护当前正在运行的任务数量 (
runningTasksCount)、已完成的任务数量 (completedTasksCount) 和下一个待启动任务的索引 (nextTaskIndex)。 -
结果收集: 使用一个与任务总数相同大小的数组 (
results) 来按原始顺序存储每个任务的结果。 -
递归启动: 创建一个
launchTask函数。当有空闲的并发槽位 (runningTasksCount < maxConcurrency) 且有待启动的任务 (nextTaskIndex < totalTasks) 时,就启动一个新任务。 -
任务完成回调: 每个任务完成后,减少
runningTasksCount,增加completedTasksCount。 -
填补空位: 任务完成后,立即尝试调用
launchTask来填补因任务完成而释放的并发槽位。 -
最终回调: 当所有任务都完成 (
completedTasksCount === totalTasks) 时,调用最终的回调函数finalCallback。 -
初始启动: 在
control函数的开始
作者:小小小小宇
链接:juejin.cn/post/751674…
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。