【问题标题】:When does this event emitter start?这个事件发射器什么时候开始?
【发布时间】:2021-09-10 14:26:21
【问题描述】:

我在 Node v14.15.1 中编写了一些按我想要的方式工作的代码,但我并不完全理解它是如何工作的。这里是:

    const rows = await new Promise(resolve => {
        const result = [];
        const file = fs.createReadStream('src/tests/readability/input.csv');
        const reader = file.pipe(csv());
        reader.on('data', row => {
            result.push(row);
        });
        reader.on('end', () => {
            resolve(result);
        });
    });

我的问题是,事件发射器什么时候开始触发事件并调用回调函数?因为我从来没有调用过任何类型的start() 函数。我使用reader.on() 分配回调函数,然后读取CSV 文件。就像为什么在我有机会分配回调之前它没有开始读取文件,因此让我错过了事件的开始甚至所有事件?

【问题讨论】:

  • csv() 是做什么的?
  • @GabrielLupu csv()const csv = require('csv-parse');返回的函数

标签: javascript node.js asynchronous


【解决方案1】:

当您附加 data 处理程序时,流将开始发出数据

https://nodejs.org/api/stream.html#stream_event_data

将“数据”事件侦听器附加到尚未显式暂停的流中会将流切换到流动模式。数据将在可用时立即传递。

https://areknawo.com/node-js-file-streams-explained/

流动模式

“流动模式”在本质上肯定要复杂一些。在这里,.read() 方法被自动调用,让您只使用“data”事件中的给定数据,在 .read() 调用之后立即发出,并带有一个新的数据块。

// ...
readable.on("data", dataChunk => {
    // code
});

此外,“流动模式”具有内置的保护措施,可防止在没有适当的处理程序时自动读取数据。因此,只有当您添加“数据”事件处理程序时,数据才会开始流动。如前所述,这也会从“暂停”模式切换到“流动”模式。不过你还是要小心!在没有“数据”事件处理程序的情况下调用 .resume() 方法,或者删除处理程序,不会停止读取过程,会导致数据丢失!

【讨论】:

    【解决方案2】:

    为了了解事件发射器何时被触发,首先您需要了解视频中解释的事件loop works in Javascript

    基本上是代码运行的时候,遇到的时候

    const file = fs.createReadStream('src/tests/readability/input.csv');

    它是通过Web API传递的,即使当时数据可用,它也只会作为新条目进入事件循环,因此需要等到所有条目才能执行。执行该条目时,它已经将回调函数附加到相应的条目。

    reader.on('data', row => {result.push(row);});reader.on('end', ()=> {resolve(result);});

    【讨论】:

      猜你喜欢
      • 2015-07-10
      • 2016-12-01
      • 2011-04-27
      • 1970-01-01
      • 2021-04-26
      • 2012-06-01
      • 1970-01-01
      • 2011-01-01
      • 2010-11-18
      相关资源
      最近更新 更多