我创建了一个文件流来编写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();
我当然可以宣传任何事件,但它是哪个事件?
答案 0 :(得分: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现在几乎已经成为标准,总是在寻找回调函数,它允许你在async块完成后运行代码。