RxJS'CombineLatest'如果不是所有输入都立即可用,则会出错

时间:2019-01-25 20:29:54

标签: rxjs

我经常使用combineLatest组合3或4个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(如果有任何输入为空,则为short-circuits)。我说的是什么时候通常不立即提供值。

0 个答案:

没有答案