方法仅在angular 6方法中返回最后一次返回

问题描述 投票:0回答:2
isAuthenticated(): Observable<boolean> {
    this.data.currentMessage.subscribe((user: User) => {
      this.user = user;
      if (this.user.id) {
        return of(true); //line 5
      } else {
        if (localStorage.getItem(CommonConstants.TOKEN)) {
          this.loginService.getUserDetails().subscribe((res: User) => {
            this.user = res;
            this.data.changeMessage(res);
            if (this.user.id) {
              return of(true); //line 12
            } else {
              return of(false); //line 14
            }
          })
        }
      }
    })
    return of(true); //line 20
  }

在这里,即使满足条件,我在第5,12,14行的回归都没有回来。它总是返回第20行的最后一个返回值。为何这种奇怪的行为?

环境 :

角6

angular typescript angular6
2个回答
0
投票

你还需要返回observable

isAuthenticated(): Observable<boolean> {
    return this.data.currentMessage.subscribe((user: User) => {
      this.user = user;
      if (this.user.id) {
        return of(true); //line 5
      } else {
        if (localStorage.getItem(CommonConstants.TOKEN)) {
          this.loginService.getUserDetails().subscribe((res: User) => {
            this.user = res;
            this.data.changeMessage(res);
            if (this.user.id) {
              return of(true); //line 12
            } else {
              return of(false); //line 14
            }
          })
        }
      }
    })
    return of(true); //line 20
  }

0
投票

原因是因为有问题的代码是异步的。这意味着,尽管第20行是函数中的最后一行,但它实际上是第一行执行的行。

我建议使用像mapflatMap这样的函数,而不是订阅,它允许你转换Observable

尝试这样的事情:

  isAuthenticated(): Observable<boolean> {
    return this.data.currentMessage.pipe(
      flatMap((user: User) => {
        this.user = user;
        if (this.user.id) {
          return of(true); //line 5
        } else if (localStorage.getItem(CommonConstants.TOKEN)) {
          return this.loginService.getUserDetails()
        }
      }),

      map((res: User) => {
        this.user = res;
        this.data.changeMessage(res);
        return this.user.id;
      })
    );
  }
© www.soinside.com 2019 - 2024. All rights reserved.