Как дождаться асинхронного метода, определенного внутри подписки, прежде чем завершить Rxjs Observable? - PullRequest
2 голосов
/ 24 октября 2019

Давайте возьмем код ниже:

myObservable.subscribe({
  next: async () => {
    await something();
  },
  complete: () => {
    console.log('All async task are comlpeted');
  }
});

Проблема в том, что console.log вызывается после срабатывания последнего next, но я хочу, чтобы он вызывался после того, как последний something()готово.

Есть ли способ сделать это?

Я указываю, что я сам реализовал myObservable, используя new Obsercable(observer => ...). Так что это может быть изменено.

1 Ответ

1 голос
/ 24 октября 2019

Я бы либо: а) придерживался наблюдаемого рецепта, и преобразовывал обещания в наблюдаемые, либо б) придерживался паттерна обещание / асинхронное ожидание, и преобразовывал наблюдаемые в обещания. Я, честно говоря, понятия не имею, как успешно смешать эти два.

Решение на основе Rx:

import { from } from 'rxjs';
import { finalize } from 'rxjs/operators';

myObservable.pipe(
    switchMap(() => from(something()),
    finalize(() => console.log('All async task are comlpeted')),
).subscribe(someFunction);
...