Я часто использую combineLatest
для объединения 3 или 4 наблюдаемых для вычисления простого условия.
Если один из «комбинированных» наблюдаемых не излучает, он будет блокироваться, пока не сработает. Это может быть очень сложно отладить, если позже что-то, что всегда испускало, немедленно прекращает излучать.
Примечание: мне это особенно нужно для логики, связанной с пользовательским интерфейсом, где могут быть наблюдаемые, которые представляют такие вещи, как ширина экрана / положение прокрутки / и т. Д. Так что они должны быть всегда там, но если они внезапно ломаются (особенно на мобильном телефоне) трудно отследить, что его блокирует.
Так что мне нужно что-то вроде 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
(который короткое замыкание , если какой-либо из входов ПУСТОЙ). Я говорю о том, когда значение просто не сразу доступно - обычно.