Javascript 为什么';完成';在_flush完成之前在Node.js转换流上触发事件?
我希望“完成”回调只在回调一次时触发 传递给_flush的已完成,但它在_flush完成之前被触发。为什么?Javascript 为什么';完成';在_flush完成之前在Node.js转换流上触发事件?,javascript,node.js,stream,streaming,node.js-stream,Javascript,Node.js,Stream,Streaming,Node.js Stream,我希望“完成”回调只在回调一次时触发 传递给_flush的已完成,但它在_flush完成之前被触发。为什么? var stream = require('stream').Transform(); // Nothing interesting here stream._transform = function (chunk, enc, next) { next(); }; // _flush makes an async call. stream._flush = function (c
var stream = require('stream').Transform();
// Nothing interesting here
stream._transform = function (chunk, enc, next) {
next();
};
// _flush makes an async call.
stream._flush = function (callback) {
console.log("Expecting 1st: Entering _flush ");
return process.nextTick(function () {
console.log("Expecting 2nd: Done with _flush");
callback();
});
};
stream.on('finish',function () {
console.log("Expecting 3rd: Entering finish callback-- should be flushed now.");
});
stream.end("chunk");
for finish表示只有当所有数据都已刷新到基础系统时才会触发该事件
查看,其目的似乎是仅当调用\u flush
回调时才触发finish:
this.once('prefinish', function() {
if (util.isFunction(this._flush))
this._flush(function(er) {
done(stream, er);
});
else
done(stream);
});
要么我错过了什么,要么这是节点的转换流的错误。我想是前者,但还没有发现我的问题。谢谢你的帮助
更新:请注意,如果像sleep
模块提供的那样,将对process.nextTick()
的调用替换为对sleep
的同步调用,那么问题就会消失。该问题仅由节点v0.10中\u flush
内的异步调用触发,因此更明显的是,这是预期的结果
然而,在master(v0.11.x)中,似乎发明了一个新的“prefinish”事件,并稍微改变了一些情况。但是,如果查看,您将看到调用prefinish()的是which。当prefinish()在发出“prefinish”后返回时,将发出“finish”。在执行此操作之前,它不会等待调用_flush()回调
因此,两个版本的结果行为是相同的。现在,行为是否应该改变是另一个问题。您可能会针对这种情况创建一个github问题,并查看是否有人对修改行为感兴趣。对“finish”事件没有直接控制,并且“\u flush”不是可写流的一部分 使用PassThrough,并在“finish”事件之后执行“this.resume()”,您将得到一个“end”事件 或者,您可以按照pull请求进行操作:
或者使用模块:谢谢!我将对0.11进行测试,然后考虑打开一个问题,因为当前的行为看起来与文档不匹配。我向Node提交了一个拉请求/错误报告。我们来看看会发生什么: