2014-05-13 37 views
1

我希望只有傳回給_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內由異步調用觸發。

回答

3

在節點v0.10,_flush() is called on 'finish'中,以便更明顯地看到那是預期的。

然而,在master(v0.11.x)中,它看起來像是一個新的'prefinish'事件被髮明,並且改變了一些事情。但是,如果你看the code,你會看到prefinish()被調用哪個triggers _flush()。當prefinish()在發射'prefinish'後返回時,會發出'finish'。它不會等待在執行此操作之前調用_flush()回調。

因此,兩個版本的結果行爲是相同的。現在是否應該改變行爲是一個單獨的問題。你可以創建一個關於情況的github問題,看看是否有興趣修改行爲。

+0

謝謝!我將對0.11進行測試,然後考慮打開一個問題,因爲目前的行爲似乎與文檔不匹配。 –

+0

我向Node提交了拉取請求/錯誤報告。我們將看看會發生什麼:https://github.com/joyent/node/pull/7612 –

相關問題