我希望只有傳回給_flush的回撥 完成後,纔會觸發'完成'回調,但在_flush完成前觸發。爲什麼?爲什麼在_flush完成之前,「完成」事件在Node.js轉換流中觸發?
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用於精加工說,當所有數據已刷新到底層系統事件時纔會觸發。
看着它看起來像意圖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);
});
無論我錯過了一些東西或者這是與節點的變換流的錯誤。我認爲這是前者,但沒有發現我的問題。謝謝你的幫助!
更新:需要注意的是,如果我替換調用process.nextTick()
一起sleep
同步調用,爲sleep
模塊提供,那麼問題就會消失。該問題僅在_flush
內由異步調用觸發。
謝謝!我將對0.11進行測試,然後考慮打開一個問題,因爲目前的行爲似乎與文檔不匹配。 –
我向Node提交了拉取請求/錯誤報告。我們將看看會發生什麼:https://github.com/joyent/node/pull/7612 –