映射后如何在水龙头中访问原始可观测值?

时间:2018-11-08 18:33:22

标签: javascript angular typescript rxjs

我正在建立一个Angular 6后卫。由adapter = FoodAdapter(getActivity(), foodsList) 运算符计算布尔值之后,我希望getActivity() --> activity 运算符中可用的user原始值可以用来计算重定向。

map

我对RxJS非常陌生。有没有一种方法可以在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 } }) ); 之前在技术上tap,但是在转换值之前重定向似乎很奇怪。)

2 个答案:

答案 0 :(得分:2)

现在就执行您的操作会将user转换为boolean。因此,在下一个tap中,您最终将获得一个boolean

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

如果定义了user,则if(!user)仍将解析为false

如果userundefinednull,则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)
);

答案 1 :(得分:1)

您可以依次使用maptapmap。最后一个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)
);