Angular asyn c карта валидатора против разных результатов - PullRequest
0 голосов
/ 04 апреля 2020

Я написал для вас демо: StackBlitz , чтобы упростить его.

Вот ситуация, которую я получил:

enter image description here

MAP: false
TAP: false

Теперь возникает вопрос:

Почему существует различие в поведении асинхронных c валидаторов в зависимости от используемого опратора rx js?

  • если используется map, все выглядит нормально: ввод действителен, если действителен, недействителен в противном случае
  • , если используется tap, ввод не имеет значения, и в него принимается только валидатор syn c аккаунт.

Мой вопрос: почему?

1 Ответ

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

tap() и map() - два совершенно разных оператора. Они не являются взаимозаменяемыми.

map () будет использовать функцию, указанную в ее параметре, для изменения значения наблюдаемого с одной вещи на другую.

tap () запускает побочный эффект . Я не буду go слишком глубоко вдаваться в , что такое побочный эффект , но вкратце это то, что не имеет ничего общего с возвращаемым значением функции.

В вашем коде:

  static dummyTap(isValid: () => boolean): AsyncValidatorFn {
    return (control: AbstractControl): Observable<ValidationErrors | null> => {
      console.log("TAP " + isValid());
      return of(isValid).pipe(
        tap(() => isValid() ? null : {invalid: true})
      );
    };
  }

tap() здесь ничего не делает. tap() не влияет на возвращаемое значение канала, в котором он находится.

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

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