angular - Angular 9 TypeError:无法读取未定义的属性“订阅”
问题描述
我要完成的是查看用户会话是否已经存在,如果存在则将它们登录。但是我在如何正确执行此操作方面遇到问题。它最有可能与代码执行顺序有关,但我不明白如何解决这个问题。也许是异步的?
得到:
TypeError:无法读取未定义的属性“订阅”
Sidebar.component.ts:
ngOnInit(): void {
this.authService.isLoggedIn.subscribe(res => {
if (res){
this.isLoggedIn = true;
} else {
this.isLoggedIn = false;
}
});
}
auth.service.ts:
get isLoggedIn(): Observable<boolean> {
const authToken = this.cookieService.get('cookiehere');
// console.log(authToken);
if (authToken) {
this.getUserBySession(authToken).subscribe(res => {
console.log(res);
return of(true);
}, error => {
return of(false);
});
}
if (!authToken){
console.log('No token found!');
return of(false);
}
}
getUserBySession(session) {
return this.http.get(`${this.apiPrefix}/auth/get_user_by_session?session=${session}`, { headers: this.headers })
.pipe(map((res: any) => {
if (res.user) {
this.currentUser = res.user;
return res;
} else {
return res;
}}));
}
解决方案
你在这里订阅了一个 observable,但你没有从 getter 返回一个 observable。return of(true)
你有从subscribe
回调内部返回,而不是 getter 。您必须更改它以从getUserBySession
函数返回原始的 observable
get isLoggedIn(): Observable<boolean> {
const authToken = this.cookieService.get('vmkr');
if (authToken) {
return this.getUserBySession(authToken).pipe(
map(() => true),
catchError(() => of(false))
);
} else {
console.log('No token found!');
return of(false);
}
}
虽然我认为这里的吸气剂可能会导致多个订阅出现问题。
推荐阅读
- docker - Cloudera 快速入门 Docker 容器未在 Windows 10 Home 上运行
- ios - 视图层次调试器仅显示视图框架
- python - pywinauto:传递字符串参数而不是标识符名称
- unity3d - 在不使用 Gradle 的情况下在 Unity 中启用 MultiDex
- c# - PowerShell 在桌面之间移动窗口
- python - 理解 Django 模型类的定义
- python - Flask web 应用无限进程启动最佳实践
- mysql - MySQL 使用 WHERE 加入同一张表
- android - 房间 UNIQUE 约束失败
- mysql - SQL:创建自动将一些值复制到另一个表中的触发器