как последовательно запускать несколько наблюдаемых объектов

#rxjs

#rxjs

Вопрос:

У меня есть массив наблюдаемых a$, b$, c$, d$ объектов. Я хочу, чтобы они выполнялись последовательно. Например, если a$ завершается, то b$ . Если b$ завершается, то $c

Я знаю forkJoin([a$, b$, c$, d$]) , за исключением того, что он будет делать это параллельно. Есть ли соответствующий оператор? Или я могу указать forkJoin запускать последовательно?

Ответ №1:

Вы можете использовать concat для их последовательного запуска:

 concat(a$, b$, c$).subscribe(console.log);
  

Если вы также хотите пропустить какие-либо промежуточные выбросы из исходных наблюдаемых объектов в результирующем наблюдателе, вы можете использовать что-то вроде

 concat(...[a$, b$, c$].map(source$ => source$.pipe(last())));
  

… или, если вы хотите собрать только последнее излучение каждого наблюдаемого источника в одно подобное излучение forkJoin , вы присоединяете toArray к нему:

 concat(...[a$, b$, c$].map(source$ => source$.pipe(last()))).pipe(
  toArray(),
);
  

Конечно, вы могли бы извлечь это в свой собственный оператор сейчас, если хотите:

 const concatLast = <T>(...sources: Observable<T>) => concat(
  ...sources.map(source$ => source$.pipe(last()))
).pipe(
  toArray(),
);
  

По-прежнему существуют небольшие различия forkJoin в том, как он ведет себя, когда один из исходных наблюдаемых объектов завершается без выделения.


На веб-сайте rxjs есть полезный инструмент, называемый деревом решений оператора, который поможет вам определить подходящий оператор, например, в этом случае

  • У меня есть несколько наблюдаемых объектов для объединения в один наблюдаемый объект, и
  • Я хочу подписаться на каждый по порядку

Комментарии:

1. есть ли способ вести себя как concat, как forkJoin? например, что он ждет, пока все abservables не завершатся

2. @matthias Я также вижу, что в последнее время вы не склонны принимать ответы на свои вопросы. Было бы неплохо получить обратную связь от людей, отвечающих, а также от других читателей, если бы вы использовали up- / downvotes и принимали ответы на вопросы.