我是Node的新手,所以如果我的问题太简单,请原谅我。我非常欣赏Async范例以及它在单线程中有用的原因。但是一些逻辑操作本质上是同步的。
我发现很多关于异步/同步问题的帖子,并且已经阅读了整整两天关于回调,承诺,异步/等待等等......
但我仍然无法想象应该做什么是直截了当的事情。我错过了什么!
基本上代码如下:
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
完全填充?
答案 0 :(得分:2)
这是您所写内容的执行顺序:
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!
}