0

我正在构建一个 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,但是在转换值之前重定向似乎很奇怪。)

4

2 回答 2

2

user做你现在正在做的事情会将boolean. 所以在那接下来tap,你最终会得到一个boolean.

为什么不user直接在中使用tap并摆脱它map

如果user已定义,无论如何if(!user)都会解决。false

如果userundefinednullif(!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)
);
于 2018-11-08T18:37:04.300 回答
1

您可以使用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)
);
于 2018-11-08T18:53:47.223 回答