首页 > 解决方案 > 如果所有输入都不能立即可用,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(如果任何输入为空则短路)。我说的是当一个值不能立即可用时——通常是 .

标签: rxjs

解决方案


推荐阅读