Как я могу получить доступ к исходному наблюдаемому значению при нажатии на карту? - PullRequest
0 голосов
/ 08 ноября 2018

Я строю Angular 6 охранника. После вычисления логического значения оператором map хотелось бы, чтобы исходное значение пользователя, доступное в операторе tap, вычисляло перенаправление.

return this.auth.user$.pipe(
    take(1),
    // Existing Users cannot register
    map(user => user ? false : true),
    tap(canAccess => {
        if (!canAccess) {
            // Calculate route based on user value
        }
    })
);

Я очень новичок в RxJS. Есть ли способ доступа к исходному пользовательскому значению в операторе tap без создания дублируемого наблюдаемого пользователя?

(Полагаю, технически я мог бы tap до map, но перенаправление кажется странным перед преобразованием значения.)

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Вы можете использовать map, tap, а затем map снова.Последний map позволяет вам получить Observable<boolean>, который, я полагаю, вам потребуется в конце.

  • map(user => [user, !user]) отображает исходное значение в массив из двух значений: пользовательи их флаг доступа (логический)
  • tap([user, canAccess]) => { ... } принимает оба значения и выполняет необходимые вам вычисления для пользователя в зависимости от флага
  • map(([user, canAccess]) => canAccess) принимает оба значения и возвращает то, что вам нужнов конце (логический флаг)

Таким образом, вам не нужно дублировать ваше canAccess условие.

return this.auth.user$.pipe(
  take(1),
  map(user => [user, !user]),   // !user should be equivalent to user ? false : true
  tap(([user, canAccess]) => {
    if (!canAccess) {
      // Calculate route based on user value
    }
  }),
  map(([user, canAccess]) => canAccess)
);
0 голосов
/ 08 ноября 2018

То, что вы делаете сейчас, преобразует user в boolean. Так что в следующем tap вы в конечном итоге получите boolean.

Почему бы вам не использовать user непосредственно в tap и избавиться от этого map?

Если определено user, if(!user) все равно разрешится до false.

А если user равно undefined или null, то if(!user) разрешится до true.

И да, как вы сказали, так как вам нужно вернуть Observable<boolean>, вам придется map его до boolean

Так что вы можете использовать это:

return this.auth.user$.pipe(
    take(1),
    tap(user => {
        if (!user) {
            // Calculate route based on user value
        }
    }),
    map(user => user ? false : true)
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...