如何保证 Node 的流编写器的执行顺序?
How to guarantee execution order with Node's stream writer?
如何更改此代码:
const fs = require('fs');
let list = ['a', 'b', 'c'];
list.forEach(x => {
console.log('processing ' + x);
let out_path = x + '.txt';
let writeStream = fs.createWriteStream(out_path);
writeStream.write('a lot of stuff will go here', 'utf8');
writeStream.on('finish', () => {
console.log(out_path + ' saved');
});
writeStream.end();
});
得到这个:
processing a
a.txt saved
processing b
b.txt saved
processing c
c.txt saved
而不是这个:
processing a
processing b
processing c
a.txt saved
b.txt saved
c.txt saved
?
如果我在 forEach
循环中构建一个对象,然后使用 fs.writeFile
将每个对象写入文件,它工作正常......但我不能那样做,因为我正在写入大量数据 (GB),很快就会达到堆的限制。
使用异步等待
(async () => {
const fs = require('fs');
let list = ['a', 'b', 'c'];
for (let x of list) {
console.log('processing ' + x);
let out_path = x + '.txt';
let writeStream = fs.createWriteStream(out_path);
writeStream.write('a lot of stuff will go here', 'utf8');
writeStream.end();
await new Promise(resolve => {
writeStream.on('finish', () => {
console.log(out_path + ' saved');
resolve();
});
})
}
})();
如何更改此代码:
const fs = require('fs');
let list = ['a', 'b', 'c'];
list.forEach(x => {
console.log('processing ' + x);
let out_path = x + '.txt';
let writeStream = fs.createWriteStream(out_path);
writeStream.write('a lot of stuff will go here', 'utf8');
writeStream.on('finish', () => {
console.log(out_path + ' saved');
});
writeStream.end();
});
得到这个:
processing a
a.txt saved
processing b
b.txt saved
processing c
c.txt saved
而不是这个:
processing a
processing b
processing c
a.txt saved
b.txt saved
c.txt saved
?
如果我在 forEach
循环中构建一个对象,然后使用 fs.writeFile
将每个对象写入文件,它工作正常......但我不能那样做,因为我正在写入大量数据 (GB),很快就会达到堆的限制。
使用异步等待
(async () => {
const fs = require('fs');
let list = ['a', 'b', 'c'];
for (let x of list) {
console.log('processing ' + x);
let out_path = x + '.txt';
let writeStream = fs.createWriteStream(out_path);
writeStream.write('a lot of stuff will go here', 'utf8');
writeStream.end();
await new Promise(resolve => {
writeStream.on('finish', () => {
console.log(out_path + ' saved');
resolve();
});
})
}
})();