我希望只有在传递给 _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 (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");
完成的node.js 流文档说只有当所有数据都被刷新到底层系统时才会触发事件。
查看 Node 的 Transform 流实现的源代码,它的意图似乎是仅在_flush
调用回调时触发完成:
this.once('prefinish', function() {
if (util.isFunction(this._flush))
this._flush(function(er) {
done(stream, er);
});
else
done(stream);
});
要么我错过了一些东西,要么这是 Node 的 Transform 流的错误。我认为是前者,但没有发现我的问题。谢谢你的帮助!
更新:请注意,如果我将调用替换为process.nextTick()
同步调用sleep
,如sleep
模块提供的那样,那么问题就会消失。该问题仅由_flush
.