caolan/async queue v3如何暂停流消费?v2升级v3后饱和事件报错
解决async v3中队列
saturated/drain属性只读的问题 这个问题是async v3的破坏性变更导致的:v3版本将队列的saturated、drain等属性改为了只读,不再允许直接赋值,而是要求通过Node.js标准的事件监听方式来绑定回调逻辑。
修改后的正确代码
let q = async.queue(function(task, callback) { // 这里处理单个任务的逻辑,注意参数是task(单个任务)而非tasks callback(); }, 4); // 用on()方法监听drain事件,替代直接赋值drain属性 q.on('drain', function() { some_readable_stream.resume(); }); // 用on()方法监听saturated事件,替代直接赋值saturated属性 q.on('saturated', function() { some_readable_stream.pause(); }); some_readable_stream.on("data", function(data) { q.push(data); });
关键说明
- 事件监听替代属性赋值:async v3统一了事件处理逻辑,所有队列相关的事件(包括
saturated、drain、empty、error等)都需要通过queue.on(eventName, callback)的方式注册监听器,这更贴合Node.js的EventEmitter设计规范。 - 任务函数参数注意:如果你的队列是逐个处理任务(比如这里的
q.push(data)是单个任务),队列的任务函数第一个参数应该是单个task而非tasks,虽然v2可能兼容数组形式,但v3保持这个写法更规范。
这样修改后就能正常实现“队列饱和暂停流、队列排空恢复流”的逻辑了。
内容的提问来源于stack exchange,提问作者Peavey
相关产品推荐
相关产品推荐

