Rxjs Subject.asObservable() 不工作但 BehaviorSubject 工作......为什么?
Rxjs Subject.asObservable() not working but BehaviorSubject works...why?
我已经检查过了 https://github.com/angular/angular/issues/12129
但我没有看到任何解决方案...
。
The solution here is to create an observable variable in the component
我有但仍然无法工作...不知道为什么如果我将 UserStateService
中的 Subject 切换为 BehaviorSubject 一切正常...
注意:
UserDataService 和 UsersStateService 都在根 app.module.ts.
处提供
user-data.service.ts -> 发出我在组件中调用的 http 请求
fetchUsers():void{
this.httpClient.get<User[]>(this.apiUrl, {
observe: 'body',
responseType: 'json'
})
.subscribe( (response: User[])=>{
this.usersStateService.setUsersList(response); <-- set to local state service
});
}
用户-state.service.ts
userListState = new Subject<User[]>(); <-- Change this to BehaviorSubject<User[]>([]) everything works!
setUsersList(users: User[]):void {
this.userListState.next(users.slice());
}
getUsersListState():Observable<User[]>{
return this.userListState.asObservable();
}
component.ts
users: Observable<User[]>;
ngOnInit() {
if(this.usersStateService.hasUserList()){
this.users = this.usersStateService.getUsersListState(); -|
|
// this.usersStateService.getUsersListState() |
// .subscribe((x) => console.log(x)); -| <-- This does not output for some reason IF Subject... BehaviorSubject works..
}else{
console.log("No data in local stat -> fetch") . <-- This works either with Subject or BehaviorSubject
this.userData.fetchUsers();
this.users = this.usersStateService.getUsersListState();
}
}
HTML
<li *ngFor="let u of (users | async)">u.name</li>
请提供任何见解,谢谢!!
Subject 不保存任何数据,它只是调用任何订阅它的值。 BehaviorSubject 保存数据,每次调用 emit 时它都会替换当前数据。
当您尝试从您的服务控制台记录用户列表时:
对于主题,它不包含任何持久数据。
this.usersStateService.getUsersListState()
.subscribe((x) => console.log(x)); ==> would be empty
使用 BehaviorSubject 它保存最后的数据,也可以用值初始化。
let _array = ['one','two']
let bs = new BehaviorSubject<any>(_array ).asObservable();
bs.subscribe(arr => {
console.log(arr) // ==> Would log the _array: ['one','two']
})
所以在你的例子中,当你试图通过 Subject 获取数据时,它只是在第一次调用(当你发出时)之后不存在,而 BehaviorSubject 保存你的初始值,并且每次你发出时,所以总是持久化数据。
**如果您每次需要多个值,您应该查看 ReplySubject
我已经检查过了 https://github.com/angular/angular/issues/12129 但我没有看到任何解决方案...
The solution here is to create an observable variable in the component
我有但仍然无法工作...不知道为什么如果我将 UserStateService
中的 Subject 切换为 BehaviorSubject 一切正常...
注意: UserDataService 和 UsersStateService 都在根 app.module.ts.
处提供user-data.service.ts -> 发出我在组件中调用的 http 请求
fetchUsers():void{
this.httpClient.get<User[]>(this.apiUrl, {
observe: 'body',
responseType: 'json'
})
.subscribe( (response: User[])=>{
this.usersStateService.setUsersList(response); <-- set to local state service
});
}
用户-state.service.ts
userListState = new Subject<User[]>(); <-- Change this to BehaviorSubject<User[]>([]) everything works!
setUsersList(users: User[]):void {
this.userListState.next(users.slice());
}
getUsersListState():Observable<User[]>{
return this.userListState.asObservable();
}
component.ts
users: Observable<User[]>;
ngOnInit() {
if(this.usersStateService.hasUserList()){
this.users = this.usersStateService.getUsersListState(); -|
|
// this.usersStateService.getUsersListState() |
// .subscribe((x) => console.log(x)); -| <-- This does not output for some reason IF Subject... BehaviorSubject works..
}else{
console.log("No data in local stat -> fetch") . <-- This works either with Subject or BehaviorSubject
this.userData.fetchUsers();
this.users = this.usersStateService.getUsersListState();
}
}
HTML
<li *ngFor="let u of (users | async)">u.name</li>
请提供任何见解,谢谢!!
Subject 不保存任何数据,它只是调用任何订阅它的值。 BehaviorSubject 保存数据,每次调用 emit 时它都会替换当前数据。
当您尝试从您的服务控制台记录用户列表时:
对于主题,它不包含任何持久数据。
this.usersStateService.getUsersListState()
.subscribe((x) => console.log(x)); ==> would be empty
使用 BehaviorSubject 它保存最后的数据,也可以用值初始化。
let _array = ['one','two']
let bs = new BehaviorSubject<any>(_array ).asObservable();
bs.subscribe(arr => {
console.log(arr) // ==> Would log the _array: ['one','two']
})
所以在你的例子中,当你试图通过 Subject 获取数据时,它只是在第一次调用(当你发出时)之后不存在,而 BehaviorSubject 保存你的初始值,并且每次你发出时,所以总是持久化数据。
**如果您每次需要多个值,您应该查看 ReplySubject