Избегайте выхода из цикла for-await при использовании асинхронных итераторов
Я использую эту библиотеку https://www.npmjs.com/package/event-iterator для использования асинхронных итераторов. У меня есть следующая функция
export function grpcClientReadableStreamToAsyncIterator<T>(
stream: grpc.ClientReadableStream<T>
): AsyncIterable<T> {
return new EventIterator((queue) => {
stream.addListener("data", queue.push);
stream.addListener("close", queue.stop);
stream.addListener("error", queue.fail);
return () => {
stream.removeListener("data", queue.push);
stream.removeListener("close", queue.stop);
stream.removeListener("error", queue.fail);
stream.destroy();
};
});
}
У меня есть функция, которая использует его следующим образом
export function subscribeMyServicePromise(): AsyncIterable<TrieProof> {
return grpcClientReadableStreamToAsyncIterator(
<some function which returns grpc.ClientReadableStream>
);
}
Когда я пытаюсь использовать такую асинхронную функцию
(async () => {
console.log("here");
let myAsyncIterableObj: AsyncIterable<MyObj> = await subscribeMyServicePromise()
for await (const tp of myAsyncIterableObj){
console.log("processing: ");
}
console.log("now here");
}()
Он просто печатает следующее и выходит
here
processing:
processing:
processing:
processing:
У меня вопрос, почему не печатается "сейчас здесь". Похоже, процесс завершается после завершения цикла for await. Как мне этого избежать?
РЕДАКТИРОВАТЬ
Я мог бы сделать это
const iterator = myAsyncIterableObj[Symbol.asyncIterator]()
await iterator.next();
await iterator.next();
await iterator.next();
await iterator.next();
console.log("now here")
и он отлично работает. Есть ли проблемы с моим способом написанияfor-await
?