问题描述
使用Node.js中的流编写器,编写一个Node.js代码以在文件中写入字符串“ Hello world” 10 ^ 5次。
我尝试使用循环,但是没有内存不足错误,系统挂起。
还有更好的方法吗?
var fs = require('fs');
var wstream = fs.createWriteStream('D:\\myOutput.txt');
for(var i=0;i<10^5;i++){
wstream.write('Hello World!\n');
}
wstream.end();
解决方法
Node.js是一个单线程执行环境,当您在循环中写入数据时,node.js将没有机会执行其他任务, 从文档(https://nodejs.org/docs/latest-v12.x/api/stream.html#stream_writable_write_chunk_encoding_callback中可以看到,nodejs不能保证一旦调用write就可以写入所有数据,可以对它进行缓冲,如果希望节点保持响应状态,则必须释放事件循环(https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/#what-is-the-event-loop)来执行其他任务,可以同时执行这两个操作的示例如下。希望这可以解决问题
var fs = require('fs');
var wstream = fs.createWriteStream('myOutput.txt');
wstream.on('error',function (err) {
console.log(err);
});
async function write()
{
for(var i=0;i<10^5;i++){
await writeStream(wstream,'Hello world!\n');
}
wstream.end();
}
async function writeStream (stream,data) {
if (!stream.write(data)) {
return new Promise((resolv,reject) => {
stream.once('drain',() => {resolv();});
});
} else {
return Promise.resolve();
}
}
write();