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

时间:2018-03-13 12:55:36

标签: node.js

我是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完全填充?

1 个答案:

答案 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!
}