Node.js事件循环忽略读取流数据事件内部的setTimeout吗?

问题描述 投票:-1回答:1

我正在澄清有关Node.js如何执行计时器的疑问。通常,在节点脚本中包含setTimeout块时,即使没有其他内容,事件循环也将在setTimeout中等待指定的毫秒数,并在运行回调后退出。

但是考虑下面的代码

const fs = require('fs');

let readable = fs.createReadStream('large.csv');
readable.on('data', async chunk => {
    let rows = parseCsvRow(chunk);  
    try {
        for (let i = 0; i < rows.length; i++) {
            console.log(i);
            await someAsyncOperation(rows[i]);
        }
    } catch (error) {
        //something went wrong
    }
});

readable.on('end', chunk => {
    console.log('csv file processed successfully');
});

function someAsyncOperation(){
    return new Promise((resolve, reject) => {
        setTimeout(resolve, 2000);
    });
}

我正在读取的csv文件大约有300行,并且我为每一个触发一个ajax请求(为简单起见,代码已隐藏)需要大约100ms的时间运行,我在这里使用setTimeout模拟了它。

当我在上述程序上运行时,它几乎立即退出,而无需等待所有未完成的setTimeout计时器成功运行。仅仅是因为从读取流上的data事件内部安排的计时器,事件循环才忽略它?它不应该等待所有计时器执行吗?

注-我知道上面的代码不是正确的方式来做我正在做的事情,但这只是一个示例,目的是演示我很难理解的概念。

javascript node.js event-loop
1个回答
0
投票

这与Node.js或事件循环无关。

问题是,您正在将async函数传递给某些函数,该函数对其返回的承诺不起作用。那是有前途的反模式之一。仅当其中之一为true时,才将async函数用作回调:

  • 执行回调的事物将使用或返回promise(例如,Promise.all因为它使用了它们,或者在数组上是map,因为它返回了它们)
  • 您不在乎,当您的async函数可能会暂停在async上时,调用await函数的东西是否继续工作,并且async函数中的所有内容都包装在[ C0] / try处理拒绝。

Node.js的特定部分是:如果您希望在完成某件事之前阻止对catch处理程序的进一步调用,则需要data流,然后在以后pause

© www.soinside.com 2019 - 2024. All rights reserved.