Безопасно / нормально ли сочетать take (1) и defaultIfEmpty при подписке на Observable <boolean>? - PullRequest
1 голос
/ 24 апреля 2020

Я использую следующий код, чтобы в основном убедиться, что я получаю результат от Observable

this.authenticationService.isLoggedIn
  .pipe(
    take(1),
    defaultIfEmpty(false)
  )
  .subscribe(result => return result);

Почему-то мне это кажется неправильным, может быть, потому что это кажется процедурным.

Этот метод в порядке? Приведет ли это мне какие-либо проблемы?

Ответы [ 2 ]

0 голосов
/ 25 апреля 2020

Все зависит от того, что делает isLoggedIn.

Понятно, что isLoggedIn возвращает наблюдаемое.

Теперь, и наблюдаемое может сделать только 3 вещи

  • он может уведомлять, т. Е. Излучать некоторые данные для потребления Наблюдателями, которые подписаны

  • может выдавать ошибку

  • он может завершить

Итак, первый вопрос: сколько раз isLoggedIn может уведомить? Это всего лишь один выстрел или поток уведомлений? Если он может выдать только одно значение и затем завершить, то оператор take(1) бесполезен.

Но есть также случай, когда isLoggedIn никогда не уведомляет и просто завершает работу. В этом случае уведомление никогда не будет отправлено наблюдателем своему подписчику. Использование оператора defaultIfEmpty гарантирует, что что-то уведомляется даже в этом случае.

Итак, читая ваш код, я понимаю, что isLoggedIn может вести себя этими двумя способами

  1. Излучать больше, чем один раз, но вы заинтересованы только в первом уведомлении
  2. Никогда не уведомлять и просто заполнить, в этом случае вы хотите, чтобы false было возвращено

Если это не так, оно может В таком случае ваш код может быть упрощен.

0 голосов
/ 24 апреля 2020

Если в вашем коде нормально, что this.authenticationService.isLoggedIn завершается без emit - тогда и код в вашем вопросе тоже в порядке. Если this.authenticationService.isLoggedIn что-то испустит в какой-то момент времени и завершится после - тогда defaultIfEmpty является избыточным.

...