Node.js中使用async npm队列push前如何检查ID是否存在?
问题解答
一、推送任务前检查ID是否存在
要判断ID是否已在队列中,需要同时检查等待执行的任务和正在执行的任务,async.queue提供了对应的属性和方法来获取这些任务:
实现代码
// 检查ID是否存在于队列(含等待、正在执行)的工具函数 function isIdInQueue(queue, targetId) { // 检查等待队列:tasks数组中每个元素的data是推送的任务对象 const inWaiting = queue.tasks.some(task => task.data.id === targetId); // 检查正在执行的任务:running()返回当前正在运行的任务数组 const inRunning = queue.running().some(task => task.id === targetId); return inWaiting || inRunning; } // 推送任务时做检查 const newTask = { name: element.name, id: element.id }; if (!isIdInQueue(taskQueue, newTask.id)) { taskQueue.push(newTask); console.log(`任务ID ${newTask.id} 已加入队列`); } else { console.log(`任务ID ${newTask.id} 已存在,无需重复添加`); }
说明
queue.tasks:存储所有等待执行的任务,每个任务项的data字段就是你通过push传入的任务对象queue.running():返回当前正在执行的任务数组,数组元素就是你传入的任务对象
二、async.queue 简单易懂说明
针对官方文档难理解的问题,整理核心用法和关键点:
1. 队列创建
// 语法:async.queue(任务处理函数, 最大并发数) const taskQueue = async.queue(async (taskData, callback) => { // 这里写你的任务逻辑,比如请求接口、处理数据 console.log(`处理任务ID:${taskData.id}`); // 如果用async函数,可省略callback(async函数返回Promise,async库会自动等待) // 如果是回调风格的异步操作,必须调用callback()标记任务完成 }, 5); // 最大同时执行5个任务
2. 常用方法/属性
- 添加任务:
- 单个任务:
taskQueue.push({ id: 1, name: '任务1' }) - 批量任务:
taskQueue.push([{ id:1 }, { id:2 }])
- 单个任务:
- 任务状态查询:
queue.tasks.length:等待执行的任务数量queue.running().length:正在执行的任务数量
- 队列事件:
- 所有任务完成时触发:
taskQueue.drain(() => { console.log('所有任务已执行完毕'); }); - 任务出错时触发:
taskQueue.error((err, task) => { console.log(`任务ID ${task.id} 执行出错:${err}`); });
- 所有任务完成时触发:
- 队列控制:
- 暂停队列:
taskQueue.pause()(正在运行的任务会继续完成,新任务暂停执行) - 恢复队列:
taskQueue.resume()
- 暂停队列:
3. 关键注意点
- 如果任务处理函数是
async函数,不需要手动调用callback,async库会自动等待Promise resolve;如果是传统回调式异步操作(比如fs.readFile),必须调用callback()来告诉队列任务已完成,否则队列会卡住。
内容的提问来源于stack exchange,提问作者kevin richard
相关产品推荐
相关产品推荐

