如何在 Node 中强制执行顺序语句



我是 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!
}

最新更新