gpt4 book ai didi

node.js - 如何在 Node 中强制顺序执行语句?

转载 作者:太空宇宙 更新时间:2023-11-03 23:21:27 24 4
gpt4 key购买 nike

我是 Node 新手,所以如果我的问题太简单,请原谅我。我完全理解异步范例以及为什么它在单线程中很有用。但有些逻辑操作本质上是同步的。

我发现了很多关于异步/同步问题的帖子,并且已经阅读了整整两天有关回调、 promise 、异步/等待等的文章...

但我仍然无法弄清楚什么应该是直接而简单的事情。我是不是错过了什么!

基本上对于下面的代码:

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

关于node.js - 如何在 Node 中强制顺序执行语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49256805/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com