首页 > 解决方案 > NGXS Select Observable上的RxJS超时?

问题描述

我面临一个奇怪的问题,希望有人能为我提供一些启示。

我有一部分状态会定期更新(为了这个问题,假设每 10 秒一次)。如果在 X 时间内没有针对该值更新状态,我想订阅该状态的选择器并超时。我正在使用 rxjs 超时运算符来执行此操作。

@Select(MyState.myValue) myValue$: Observable<number>;

setInterval(() => //updating MyState with a new myValue, 10000);

myValue$
    .pipe(timeout(20000))
    .subscribe({
        next: myValue => console.log(myValue),
        error: err => console.log(err)
    })

我看到的是 TimeoutError 在 20 秒后被抛出,无论这些值的发出频率如何。

但是,如果我只是将它应用于由 interval() 函数返回的 Observable,超时确实有效。使用下面的代码,我永远不会看到 TimeoutError,这是我期望在上面的 NGXS 代码中发生的。

interval(10000)
    .pipe(timeout(20000))
    .subscribe({
        next: myValue => console.log(intervalValue),
        error: err => console.log(err)
    })

因此,Select 装饰器返回的 Observable 似乎存在一些问题?

标签: angularrxjstimeoutobservablengxs

解决方案


使用超时运算符时,应为 with 属性提供回调函数。否则它会发出TimeoutError

对于您的问题,您还应该为每个参数提供一个值。每个参数定义在结果 observable 超时之前从源推送的每个值之间允许的时间

示例 =>

test$.pipe(
   timeout({
     each: 1000,
     with: () => functionExecutedWithTimeout()
   })
)

有关更多信息,请参阅 timeout 运算符的官方文档


推荐阅读