Angular 8 - фильтрация перед подпиской, запускается ли она, если фильтр возвращает ноль? - PullRequest
1 голос
/ 20 апреля 2020

Я продолжаю проект от бывшего сотрудника, и он что-то кодировал так, как я никогда не видел, может ли кто-нибудь помочь мне понять причину этого?

this.loginState.User
      .pipe(filter(u => !!u))   // what on earth is this
      .subscribe(u => {
        if (!u.isAuthenticated && !u.hasLocalPassword .....

так что в основном этот блок кода проверяет, есть ли активный пользователь, вошедший в систему, но что filter(u => !!u) мне не понятно. Для меня это было бы равно:

 this.loginState.User
          .subscribe(u => {
             if (u) {
               if (!u.isAuthenticated && !u.hasLocalPassword .....
             }

, в основном обертывание моего кода после подписки в if (u). Я не прав, и это не одно и то же, и на самом деле есть преимущества в этом с фильтром?

Спасибо

1 Ответ

1 голос
/ 20 апреля 2020

Как уже упоминалось в комментариях, включение условия в filter должно быть (и в вашем случае) эквивалентно наличию этого логика c в подписке.


Это это очень хорошая идея, чтобы привыкнуть к использованию операторов. Ваша цель должна прекратить использование подписки без необходимости ( использовать в шаблоне asyn c pipe ).

Если вам необходимо подписаться, попробуйте добиться подписки без логи c. это означало бы помещать каждую операцию в переносимые операторы, объединяя ее так, чтобы она декларативно заявляла о происходящем.

Примером подписки без логического c будет:

// myObs$: Observable<Value[]>;

myObs$.pipe(
  filter(values => values.length > 0),
  map(values => values.map(val => val * 2)),
  tap(values => doSomeSideEffect(values)),
).subscribe();
...