我是 Node 的新手,如果我的问题太简单,请原谅我。我完全欣赏异步范式以及为什么它在单线程中很有用。 但某些逻辑操作本质上是同步的。
我找到了很多关于异步/同步问题的帖子,并且已经阅读了整整两天关于回调、承诺、异步/等待等......
但我仍然想不通应该做什么是直截了当和简单的事情。 我错过了什么!
基本上对于下面的代码:
const fs = require('fs');
var readline = require('readline');
function getfile (aprodfile) {
var prodlines = [];
var prodfile = readline.createInterface({input: fs.createReadStream(aprodfile)});
prodfile.on('line', (line) => {prodlines.push(line)});
prodfile.on('close', () => console.log('Loaded '+prodlines.length));
// the above block is repeated several times to read several other
// files, but are omitted here for simplicity
console.log(prodlines.length);
// then 200+ lines that assume prodlines already filled
};
我得到的输出是:
0
Loaded 11167
而我期望的输出是:
Loaded 11167
11167
这是因为 console.log
语句在prodfile.on
事件完成之前执行。
有没有一种很好的干净方法来告诉 Node 按顺序执行命令,即使阻塞? 或者更好的是告诉console.log
(以及它后面的 200+ 行代码(等到prodlines
完全填充?
这是你写的执行顺序:
prodfile.on('line', line => { // (1) subscribing to the 'line' event
prodlines.push(line) // (4), whenever the 'line' event is triggered
});
prodfile.on('close', () => { // (2) subscribing to the 'close' event
console.log('Loaded '+prodlines.length) // (5), whenever the 'close' event is triggered
});
console.log(prodlines.length); // (3) --> so it logs 0, nothing has happened yet
你可以做的是这个:
function getfile (aprodfile) {
var prodlines = [];
var prodfile = readline.createInterface({input: fs.createReadStream(aprodfile)});
prodfile.on('line', line => { prodlines.push(line) });
prodfile.on('close', () => {
console.log('Loaded '+prodlines.length)
finishedFetching( prodlines );
});
};
function finishedFetching( prodlines ) {
console.log(prodlines.length) // 200!
}