在等待中使用break而不结束基础流

时间:2019-04-06 21:49:40

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

在Node.js项目中,我使用了一个for await of循环和一个可读流作为数据源,所以我的代码在概念上看起来像这样:

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

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

如果我只是这样做:

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

  // ...
}

循环按预期方式停止,但是流被关闭。如何在不关闭流的情况下 实现同一件事?

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

我想通过for await of循环来做什么,如果可以,怎么做?如果没有,我最好的选择是什么?

1 个答案:

答案 0 :(得分:2)

可以通过使用承诺的事件发射器监听data事件来实现此行为。

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

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

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

  // ...
}