2017-06-02 55 views
0

我創建了一個文件流寫一個CSV文件:如何等待文件流完成寫入之前關閉它?

var logger = fs.createWriteStream('restaurants.csv', { 
     flags: 'w' // 'a' means appending (old data will be preserved) 
    }); 
    logger.write("sep=,\n"); 

當我寫完,我關閉流是這樣的:

logger.end(); 
    logger.close(); 

但是,當我做到這一點,部分文件在結尾處丟失。我試圖睡覺之前關閉流:

await Promise.delay(2000); 
    logger.end(); 
    logger.close(); 

而突然,該文件是完整的。但超時是一個愚蠢的解決方案。文件流完成寫入後是否發出任何事件?基本上我需要的是:

await logger.doneWriting(); 
    logger.end(); 
    logger.close(); 

我可以promisify任何事件當然,但它是哪個事件?

+0

您是否嘗試過'logger.on(「end」,...)',或'logger.on(「close」,...)'? –

回答

2

fs.createWriteStream()返回WriteStream對象,它是WritableStream,這意味着,當你調用.write()你打電話writable.write()這實際上需要一個回調函數作爲參數,所以你可以關閉該流權爲完成後!

var logger = fs.createWriteStream('restaurants.csv', { 
    flags: 'w' // 'a' means appending (old data will be preserved) 
}); 
logger.write("sep=,\n",() => { 
    // Done writing... do what's needed then close the stream if it isn't used anymore 
}); 

異步JavaScript幾乎已經成了一個標準的今天,始終在尋找一個回調函數,它就是讓你當它完成的異步塊完成後運行代碼。

+0

我可以寫空字符串並仍然可以回撥嗎?因爲在代碼結束時,我不會寫任何東西(它發生在while循環中),但我仍然需要等到上一次發生的寫入完成。 –

+0

我不明白爲什麼回調會失敗,因爲你仍然會在技術上寫入文件......那裏不會有任何內容。你總是可以試試看看會發生什麼,我很想知道! –