コールバックの「終了」は、_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