В проекте 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
, и если да, то как? Если нет, то какова моя лучшая альтернатива?
Это сработало ?… если вы превратите свой комментарий в ответ, я с радостью приму его!
Рад, что это помогло. Я не уверен, есть ли лучшие способы, но я подозреваю, что их нет.
Этого можно добиться, прослушивая событие data
с обещанным эмиттером событий.
p-event
поддерживает для этой цели асинхронные итераторы:
const asyncIterator = pEvent.iterator(readableStream, 'data', {
resolutionEvents: ['finish']
});
for await (const item of asyncIterator ) {
if (condition) {
break;
}
// ...
}
Вы могли бы использовать что-то вроде github.com/sindresorhus/p-событие на
data
. Приводит ли это к желаемому поведению?