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
你还需要返回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
}
原因是因为有问题的代码是异步的。这意味着,尽管第20行是函数中的最后一行,但它实际上是第一行执行的行。
我建议使用像map
或flatMap
这样的函数,而不是订阅,它允许你转换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;
})
);
}