【问题标题】:Using break in for-await-of without ending the underlying stream使用 break in for-await-of 而不结束底层流
【发布时间】:2019-08-28 10:37:15
【问题描述】:

在 Node.js 项目中,我使用带有可读流的 for await of 循环作为数据源,因此我的代码在概念上如下所示:

for await (const item of readableStream) {
  // ...
}

可读流存在于循环之前,即它不是为循环创建的,但它已经存在。现在的重点是我希望能够停止收听此流,即我想从循环中break,但我确实想关闭可读流。 p>

如果我只是这样做:

for await (const item of readableStream) {
  if (condition) {
    break;
  }

  // ...
}

循环按预期停止,但流被关闭。我怎样才能在关闭流的情况下达到同样的效果?

我不能直接使用on('data'),因为我要执行的操作包括运行async 函数,因此这不起作用。我知道我可以使用TransformWritable 流来解决这个问题,但这似乎是我想避免的一些开销。

我想通过for await of 循环来实现吗?如果可以,如何实现?如果不是,我最好的选择是什么?

【问题讨论】:

  • 您可以在data 上使用github.com/sindresorhus/p-event 之类的东西。这会产生预期的行为吗?
  • 这成功了???
  • 很高兴它有帮助。我不确定是否有更好的方法,但我怀疑没有。

标签: javascript node.js for-loop async-await stream


【解决方案1】:

可以通过使用 Promisified 事件发射器侦听 data 事件来实现此行为。

p-event 为此目的支持异步迭代器:

const asyncIterator = pEvent.iterator(readableStream, 'data', {
  resolutionEvents: ['finish']
});

for await (const item of asyncIterator ) {
  if (condition) {
    break;
  }

  // ...
}

【讨论】:

    猜你喜欢
    • 2021-07-15
    • 2015-10-31
    • 1970-01-01
    • 2019-11-11
    • 1970-01-01
    • 2021-08-29
    • 1970-01-01
    • 2020-06-27
    相关资源
    最近更新 更多