#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 и принимали ответы на вопросы.