Angular 2 & RxJS: Subject.next 在某些情况下不工作
Angular 2 & RxJS: Subject.next not working in some cases
我有这项服务(authApiService.login()
工作正常,获得预期数据):
@Injectable({ providedIn: 'root' })
export class AuthService {
private loggedIn: Subject<boolean> = new BehaviorSubject<boolean>(
!this.isTokenExpired()
);
get isLoggedIn(): Observable<boolean> {
return this.loggedIn.asObservable();
}
logout(): void {
/* ... */
this.loggedIn.next(false);
}
login(login: string, password: string): Observable<LoginResult> {
return this.authApiService.login(login, password).pipe(
map((result) => {
if (result) {
/* ... */
this.loggedIn.next(true);
}
return result;
})
);
}
}
以及以下组件函数(processLogin()
工作正常,无需订阅即可测试):
ngOnInit(): void {
this.loggedInSub = this.authService.isLoggedIn.subscribe(
(loggedIn: boolean) => this.processLogin(loggedIn)
);
}
在我从我的应用程序注销后(从服务调用 logout()
),此 .next()
实际上发出错误值并且组件内部订阅(在 ngOnInit()
中声明)有效。但是当我调用服务的 login()
方法时,调试器显示 this.loggedIn.next(true);
已执行,但组件内的订阅不执行提供的代码。我不知道为什么 logout() => next(false)
有效,而 login() => next(true)
无效。所有提到的没有实施的方法都经过测试并且工作正常。请帮忙!
编辑:
刚刚注意到 - login() => next(true)
不起作用,但页面刷新有效(页面在订阅中表现得像“true”)
2 个月后(总共 6 个月)我修好了它。这只是关于从模块提供者中删除 AuthService 。似乎不同的实例是在不同的模块中创建的。但我不是Angular专家,如果有人知道如何解释,请尝试。
我有这项服务(authApiService.login()
工作正常,获得预期数据):
@Injectable({ providedIn: 'root' })
export class AuthService {
private loggedIn: Subject<boolean> = new BehaviorSubject<boolean>(
!this.isTokenExpired()
);
get isLoggedIn(): Observable<boolean> {
return this.loggedIn.asObservable();
}
logout(): void {
/* ... */
this.loggedIn.next(false);
}
login(login: string, password: string): Observable<LoginResult> {
return this.authApiService.login(login, password).pipe(
map((result) => {
if (result) {
/* ... */
this.loggedIn.next(true);
}
return result;
})
);
}
}
以及以下组件函数(processLogin()
工作正常,无需订阅即可测试):
ngOnInit(): void {
this.loggedInSub = this.authService.isLoggedIn.subscribe(
(loggedIn: boolean) => this.processLogin(loggedIn)
);
}
在我从我的应用程序注销后(从服务调用 logout()
),此 .next()
实际上发出错误值并且组件内部订阅(在 ngOnInit()
中声明)有效。但是当我调用服务的 login()
方法时,调试器显示 this.loggedIn.next(true);
已执行,但组件内的订阅不执行提供的代码。我不知道为什么 logout() => next(false)
有效,而 login() => next(true)
无效。所有提到的没有实施的方法都经过测试并且工作正常。请帮忙!
编辑:
刚刚注意到 - login() => next(true)
不起作用,但页面刷新有效(页面在订阅中表现得像“true”)
2 个月后(总共 6 个月)我修好了它。这只是关于从模块提供者中删除 AuthService 。似乎不同的实例是在不同的模块中创建的。但我不是Angular专家,如果有人知道如何解释,请尝试。