【问题标题】:Ngrx change delay() interval after X number of minutesNgrx 在 X 分钟后更改延迟()间隔
【发布时间】:2020-05-06 02:55:59
【问题描述】:

嗨,我是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();

【问题讨论】:

  • 不确定我是否理解您想要在这里实现的目标。 myObservable$ 是什么?发射一次还是保持开放?您是否尝试每 5 秒进行一次轮询,获取可观察的值并基于该值调度操作?在这种情况下重复什么?

标签: rxjs ngrx


【解决方案1】:

一种可能的解决方案是创建一个 1 分钟的 interval,然后应用自定义发射延迟,例如:

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找到

【讨论】:

    【解决方案2】:

    说实话,很难猜出你想做什么。 很高兴看到有关它的更多信息。

    您可以在下面找到代码的更新版本,该版本每 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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-09
      • 2020-03-13
      • 1970-01-01
      • 2017-07-27
      • 1970-01-01
      • 1970-01-01
      • 2013-12-03
      • 1970-01-01
      相关资源
      最近更新 更多