Задержка первых 3 предметов на 1 секунду и четвертого на 4 секунды - PullRequest
0 голосов
/ 01 июля 2018

Я пытаюсь отобразить первые 3 числа, каждое из которых задерживается на 1 секунду, а четвертое - на 4 секунды. К сожалению, мой код отображает четыре цифры на 1 секунду

import { from, of, race, timer, interval } from 'rxjs';
import { groupBy, mergeMap, toArray, map,merge, reduce, concatMap, delay, concat, timeout, catchError, take } from 'rxjs/operators';

const obs$ = from([1,2,3]).pipe(concatMap(a => of(a).pipe(delay(1000)))); 
const obs2$ = of(4).pipe(delay(4000)); 
const result$ = obs$.pipe(merge(obs2$));

const subscribe = result$.subscribe(val => console.log(val));  

Отображает 1234 |

вместо 123 ---- 4 |

этот вопрос предназначен исключительно для изучения rxjs как новичка и был протестирован на https://stackblitz.com

1 Ответ

0 голосов
/ 02 июля 2018

МЕТОД 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));
...