我希望“完成”回调仅在回调一次被触发 传递给 _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 stream documentation for finish 表示只有当所有数据都已刷新到底层系统时才会触发该事件。
查看 source code for Node's Transform stream implementation看起来目的是仅在调用 _flush
回调时触发完成:
this.once('prefinish', function() {
if (util.isFunction(this._flush))
this._flush(function(er) {
done(stream, er);
});
else
done(stream);
});
要么我错过了什么,要么这是 Node 的转换流的错误。我认为这是前者,但还没有发现我的问题。感谢您的帮助!
更新:请注意,如果我将对 process.nextTick()
的调用替换为对 sleep
的同步调用,因为 sleep
模块提供,然后问题就消失了。该问题仅由 _flush
中的异步调用触发。
最佳答案
在 Node v0.10 中,_flush()
is called on 'finish' , 因此可以更明显地看出这是预期的结果。
然而,在 master (v0.11.x) 中,它看起来像是发明了一个新的“预完成”事件并稍微改变了一些事情。但是,如果您查看 the code ,你会看到 prefinish() 被称为 triggers _flush() .当 prefinish() 在发出 'prefinish' 后返回时,'finish' 就会被发出。在执行此操作之前,它不会等待 _flush() 回调被调用。
因此两个版本的结果行为相同。现在是否应该改变行为是一个单独的问题。您可以针对这种情况创建一个 github 问题,看看是否有兴趣修改行为。
关于javascript - 为什么 'finish' 事件会在 _flush 完成之前在 Node.js 转换流上触发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23620993/