【问题标题】:pure rxjs if/else statement not reaching the else statement with merge纯 rxjs if/else 语句未通过合并到达 else 语句
【发布时间】:2018-12-05 14:00:53
【问题描述】:

我尝试在纯rxjs中写一个if/else语句,用户状态登录。在用户未登录的情况下,我只保留登录后重定向的url。

我面临的问题是用户未连接时没有存储url。

ngOnInit() {
    this.initContactUsForm();

    const signedIn$ = this.authQuery.select(state => state.signedIn).pipe(share());

    const isSignedIn$ = signedIn$.pipe(
      filter((signedIn: boolean) => signedIn),
      switchMap((signedIn: boolean) => {
        this.isSignedIn = signedIn;
        this.userId = this.authQuery.getSnapshot().sub;
        return this.authService.currentAuthenticatedUser());
      })
    );

    const isNotSignedIn$ = signedIn$.pipe(
      filter((signedIn: boolean) => !signedIn),
      switchMap((signedIn: boolean) => {
        this.isSignedIn = signedIn;
        this.authService.storeAttemptedUrl(this.router.url);
        return empty();
      })
    )

    merge(isSignedIn$, isNotSignedIn$).subscribe(
      (user: any) => this.setContactUsFormSenderUserValues(user),
      (error: any) => console.log(error)
    )
  }

我是否缺少获取网址的内容?我做错了什么?

编辑: 起初,我有这个正在工作。但我希望它采用纯可观察的风格。

signedIn$.pipe(
  switchMap((signedIn: boolean) => {
    if (signedIn) {
      this.isSignedIn = signedIn;
      this.userId = this.authQuery.getSnapshot().sub;
      return this.authService.currentAuthenticatedUser();
    } else {
      this.isSignedIn = signedIn;
      const url = this.router.url;
      this.authService.storeAttemptedUrl(url);
      return empty();
    }
  }),
).subscribe(
  (user: any) => this.setContactUsFormSenderUserValues(user),
  (error: any) => console.log(error)
)

感谢您的帮助。

【问题讨论】:

  • 我认为ifswitchMap 中的条件版本没有任何问题。无论如何,您的函数都不是纯函数,因此尝试以纯可观察的样式编写它正在向上游发展。

标签: angular rxjs


【解决方案1】:

我遇到了同样的问题行为。我观察到当合并我的流(这里是isSignedId$isNotSignedIn$)时,合并中的第二个流输入(这里是isNotSignedIn$)不会开始流动。

在删除源 Observable(此处为 signedIn$)上的 share() 运算符后,此行为发生了变化,合并的两个流都会流动,我的问题就解决了。

【讨论】:

    最近更新 更多