Ngrx change delay () интервал после X минут - PullRequest
1 голос
/ 06 мая 2020

Привет, я новичок в ngrx. Я пытаюсь создать метод, который повторяется для выполнения действия для получения обновлений статуса для элементов в наблюдаемом, пока наблюдаемый объект не станет пустым. В первую минуту я хочу повторить выполнение действия, скажем, каждые 5 секунд, а затем замедлить его до 10 секунд. Но вроде как не могу обновить длительность задержки в процессе. Буду признателен за любые предложения о том, как этого можно достичь.

        this.myObservable$
            .pipe(
                delay(pollDelay),
                takeUntil(this._destroyed),
                map(items => {
                    console.warn(new Date());
                    if(initialPollingUntil < new Date()){
                        pollDelay = 10000;
                    }                    
                    if (items.length !== 0) {
                        this._store.dispatch(getStatus({ payload: { items: items} }));
                    } else {
                        this._destroyed.next(true);
                    }                    
                }),
                repeat()
            )
            .subscribe();

Ответы [ 2 ]

0 голосов
/ 06 мая 2020

Если честно, сложно угадать, чем вы хотите заниматься. Было бы здорово увидеть больше информации об этом.

Ниже вы можете найти обновленную версию вашего кода, которая выполняет проверки каждые 5 секунд, а после того, как initialPollingUntil прошло, она выполняет проверки каждые 10 секунд.

Просто замените свой код на этот.

const tick = new BehaviorSubject(initialPollingUntil);
tick.pipe(
    switchMap(date => this.myObservable$.pipe(
        first(),
        delay(date < new Date() ? 10000 : 500),
    )),
    tap(items => {
        if (items.length !== 0) {
            this._store.dispatch(getStatus({ payload: { items } }));
        } else {
            this._destroyed.next(true);
        }
    }),
    tap(() => tick.next(tick.value)),
    // takeUntil(this._destroyed), // <- uncomment if this._destroyed should kill all subscriptions.
).subscribe();
0 голосов
/ 06 мая 2020

Одно из возможных решений - создать interval 1 минуту, а затем применить настраиваемую задержку излучения, например:

const source$ = interval(1000 * 60).pipe(
  take(2),
  // for every minute we want to increase the delay by 5 seconds
  switchMap(minute => interval((minute + 1) * 5 * 1000)),
  tap(minute => console.log(`Retrying ${new Date()}`))
);

source$.subscribe();

Полный пример можно найти в this stackblitz

...