Использование break in for-await-of без завершения основного потока - PullRequest
3 голосов
/ 07 апреля 2019

В проекте Node.js я использую цикл for await of с читаемым потоком в качестве источника данных, поэтому мой код концептуально выглядит следующим образом:

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

Доступный для чтения поток существует до цикла, то есть он не создается для цикла, но он уже существует. Теперь дело в том, что я хотел бы иметь возможность прекратить слушать этот поток, то есть я хотел бы break из цикла, но я не хочу закрыть читаемый поток.

Если я просто сделаю это:

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

  // ...
}

цикл останавливается, как и ожидалось, но поток закрывается. Как я могу добиться того же самого, без закрытия потока?

Я не могу использовать on('data') напрямую, потому что действие, которое я хочу предпринять, включает в себя запуск функции async, и, следовательно, это не будет работать. Я знаю, что я мог бы решить эту проблему с помощью потока Transform или Writable, но это, кажется, некоторые издержки, которых я бы хотел избежать.

Возможно ли то, что я хочу сделать с помощью петли for await of, и если да, то как? Если нет, то какая моя лучшая альтернатива?

1 Ответ

2 голосов
/ 07 апреля 2019

Этого можно добиться, прослушивая событие data с обещанным источником событий.

p-event для этой цели поддерживает асинхронные итераторы:

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

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

  // ...
}
...