МЕТОД 1
Оператор merge
подписывается на оба наблюдаемых (obs$
и obs2$
) одновременно . Поэтому результат, который вы получите из своего кода, можно объяснить следующим образом:
obs$ -----1-----2-----3
obs2$ -----------------------4
result$ -----1-----2-----3-----4
Вы можете достичь своей цели, заставив merge
подписаться только на одну наблюдаемую информацию за раз, указав второй аргумент как 1 (который по умолчанию равен Number.POSITIVE_INFINITY
), например:
const obs$ = from([1,2,3]).pipe(concatMap(a => of(a).pipe(delay(1000))));
const obs2$ = of(4).pipe(delay(4000));
// Provide the concurrency (second) argument as 1
const result$ = obs$.pipe(merge(obs2$, 1));
const subscribe = result$.subscribe(val => console.log(val));
МЕТОД 2
Используйте concat
вместо merge
:
const obs$ = from([1, 2, 3]).pipe(concatMap(a => of(a).pipe(delay(1000))));
const obs2$ = of(4).pipe(delay(4000));
const result$ = concat(obs$, obs2$);
const subscribe = result$.subscribe(val => console.log(val));
МЕТОД 3
В противном случае вы просто используете второй параметр concatMap
, который является индексом (начинается с 0) испускаемых элементов.
const obs$ = from([1, 2, 3, 4]);
const delayed$ = obs$.pipe(
concatMap((value, index) => {
if (index <= 2) {
// Delay the first 3 items by 1 sec
return of(value).pipe(delay(1000));
} else {
// Delay other items (here the 4th item) by 4 sec
return of(value).pipe(delay(4000));
}
})
);
delayed$.subscribe(x => console.log(x));