Как я могу использовать оператор concat в Rx JS, но игнорировать все выбросы из первой наблюдаемой - PullRequest
0 голосов
/ 20 января 2020

Допустим, у нас есть 2 наблюдаемые.

const obs1 = timer (1000); const obs2 = of (1,2,3)

Если бы я хотел дождаться завершения obs1, я, очевидно, мог бы использовать оператор concat.

obs1.pipe (concat (obs2)). подписка (console.log);

или

concat (obs1, obs2) .subscribe (console.log);

Будет работать нормально (порядок сохраняется) , но '0', испущенный из первых obs, все еще будет зарегистрирован. Есть ли способ навязать определенный порядок подписок, но игнорировать выбросы из данной наблюдаемой? (например, должны быть видны только значения из последней наблюдаемой в «цепочке»).

В этом конкретном случае я знаю, сколько значений ожидать, поэтому я мог бы просто использовать skip / takeLast, но я ищу универсальное c решение, которое не требует, чтобы я знал количество элементов, испускаемых из наблюдаемых.

Ответы [ 3 ]

3 голосов
/ 20 января 2020

Вы можете использовать только ignoreElements().

concat(obs1.pipe(ignoreElements()), obs2).subscribe(...)

. Не имеет значения, отправляет ли obs1 какие-либо next уведомления или нет. obs1 просто нужно завершить.

1 голос
/ 20 января 2020

Используйте комбайнПоследний:

Пример:

    import { timer, combineLatest } from 'rxjs';
   const timerOne$ = timer(1000, 4000);
   const timerTwo$ = timer(2000, 4000);
   const timerThree$ = timer(3000, 4000);
   combineLatest(timerOne$, timerTwo$, timerThree$).subscribe(
  ([timerValOne, timerValTwo, timerValThree]) => {

    console.log(Timer Three Latest: ${timerValThree}`
    );
  }
);

или

import { timer, combineLatest } from 'rxjs';

const timerOne$ = timer(1000, 4000);
const timerTwo$ = timer(2000, 4000);
const timerThree$ = timer(3000, 4000);

combineLatest(
  timerOne$,
  timerTwo$,
  timerThree$,
  // combineLatest also takes an optional projection function
  (one, two, three) => {
    return `${three}`;
  }
).subscribe(console.log);
0 голосов
/ 20 января 2020

Вы можете либо switchMap, либо записать значения в конвейер только для второй наблюдаемой:

const obs1 = timer(1000);
const obs2 = of(1, 2, 3);

obs1.pipe(
  concat(obs2.pipe(tap(val => console.log(val))))
).subscribe();

obs1.pipe(
    switchMap(_ => obs2)
).subscribe(console.log);
...