rxjs - 如果所有输入都不能立即可用,RxJS 'CombineLatest' 会出错
问题描述
我经常使用combineLatest
组合 3 或 4 个 Observable 来计算一个简单的条件。
如果“组合”的 Observable 之一没有发出,那么这将阻塞,直到它发出为止。如果稍后一直发出的东西立即停止发出,那么调试可能会非常棘手。
旁注:对于与 UI 相关的逻辑,我特别需要这个,其中可能有表示屏幕宽度/滚动位置等的可观察值。所以它们应该一直存在 - 但如果它突然中断(尤其是在移动)很难追踪是什么阻止了它。
因此,如果所有输入都不能立即可用,我需要的是类似combineLatestImmediate
的错误。当我说“立即可用”时,它通常来自集中式数据存储或行为主体(当然总是有一个值)。但是当它破裂时......呃。
有没有比以下更好的方法:
combineLatest(obs1, obs2, obs3)
.pipe(timeoutWith(0, throwError('Expected obs all to be available')))
甚至:
// note: take(1) is required or the wrong observable
// may get reported if the source hasn’t closed
combineLatest(obs1.pipe(take(1), timeoutWith(0, throwError('obs1 has no value'))),
obs2.pipe(take(1), timeoutWith(0, throwError('obs2 has no value'))),
obs3.pipe(take(1), timeoutWith(0, throwError('obs3 has no value'))));
如果您想要一个宽限期,您可以为超时设置一个非零值,或者将其设置为自定义运算符。但我发现对此的需求越来越多。
这是一个安全/理智的事情,以节省调试时间。
我也不在寻找forkJoin
(如果任何输入为空则短路)。我说的是当一个值不能立即可用时——通常是 .
解决方案
推荐阅读
- typescript - VS Code Prettier - Code Formatter Extension 不适用于使用 Typescript 模板的 Create-React-App
- python-3.x - 烧瓶测试 400 错误页面没有通过,但它正在工作
- javascript - 无法从控制器获取数据到 Vue 组件
- go - 这是什么意思?
- sql - 翻转列和行 SQL
- java - Spring Security 拦截除注释外
- reactjs - babel-loader 不工作,意外的令牌 '<'
- r - 一次提示用户两个值,但将它们保存在不同的变量中
- oracle - 错误 ORA-00907: 缺少右括号?
- excel - 在 VBA 中插入多个文件夹中的多个图像