Angular 12报错'source.subscribe is not a function'如何解决?
错误原因
- 核心问题出在
auth.service.ts中authStatus的定义:asObservable是BehaviorSubject实例的方法,你没有加调用括号,直接把方法本身赋值给了authStatus,而非方法执行后返回的可观察对象(Observable)。 - 后续组件中你把
authStatus当成方法调用,即使能拿到返回值,也会因为方法调用时this指向丢失,无法正确返回Observable实例,最终调用subscribe时就会抛出source.subscribe is not a function的错误。
修复方案
第一步:修改auth.service.ts代码
把authStatus的赋值改为调用asObservable()方法后的结果:
private loggedIn = new BehaviorSubject<boolean>(this.token.loggedIn()) // 这里加调用括号,直接保存Observable实例 authStatus = this.loggedIn.asObservable() changeAuthStatus(value: boolean){ this.loggedIn.next(value) }
第二步:修改组件调用代码
现在authStatus已经是Observable实例,不需要加括号调用,直接订阅即可:
public loggedIn: any; constructor( private Auth: AuthService ) { } ngOnInit(): void { // 去掉authStatus后面的调用括号 this.Auth.authStatus.subscribe((value) => { this.loggedIn = value }); }
补充说明
RxJS中只有Observable类型的实例才拥有subscribe方法,出现该报错时优先检查你调用subscribe的对象是否为合法的Observable实例,常见的触发场景包括:
- 忘记调用返回Observable的方法,直接对方法本身订阅
- 异步操作还没完成,就对未赋值的变量订阅
- 方法返回的是Promise、普通对象等非Observable类型
内容的提问来源于stack exchange,提问作者dcrox12
相关产品推荐
相关产品推荐

