RxJS 'CombineLatest' выдает ошибки, если не все входные данные доступны сразу - PullRequest
0 голосов
/ 25 января 2019

Я часто использую 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 (который короткое замыкание , если какой-либо из входов ПУСТОЙ). Я говорю о том, когда значение просто не сразу доступно - обычно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...