Избегайте выхода из цикла 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?

0 ответов

Другие вопросы по тегам