angular - 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 似乎存在一些问题?
解决方案
使用超时运算符时,应为 with 属性提供回调函数。否则它会发出TimeoutError;
对于您的问题,您还应该为每个参数提供一个值。每个参数定义在结果 observable 超时之前从源推送的每个值之间允许的时间
示例 =>
test$.pipe(
timeout({
each: 1000,
with: () => functionExecutedWithTimeout()
})
)
有关更多信息,请参阅 timeout 运算符的官方文档
推荐阅读
- html - 用于域名输入的 HTML 正则表达式?
- javascript - 使用 requestAnimationFrame 停止和继续动画
- python - 单图循环中的多线图
- d3.js - 条形图未显示在分组条形图中
- google-sheets - 将 3 个饼图的数据合并为 1 个饼图
- c# - 在 UserValidator 中覆盖 ValidateAsync
- c# - 使用 OpenXML 将 Word(.DOC 和 .DOCX)文档文件导入 MySQL 服务器数据库
- python - ibpy下单时无反应
- sql-server - 在现有列上将 Is Identity 更改为 yes
- javascript - 原型函数参数中的数组解构