【问题标题】:Rxjs Subject.asObservable() not working but BehaviorSubject works...why?Rxjs Subject.asObservable() 不工作,但 BehaviorSubject 工作......为什么?
【发布时间】:2018-06-27 18:18:45
【问题描述】:

我已经查看了这个https://github.com/angular/angular/issues/12129 但我没有看到任何解决方案...

Angular 2.0.1 AsyncPipe doesn't work with Rx Subject

这里的解决方案是在组件中创建一个可观察变量

我有但仍然无法工作...如果我将 UserStateService 中的主题切换到 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

  });

}

users-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();
}

组件.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 已经是一个 observable,你可以直接指出它。在您的组件中,您可以这样做 this.users = this.usersStateService.userListState;
  • @Vikas 感谢您提供的链接,这很有帮助

标签: angular rxjs subject behaviorsubject


【解决方案1】:

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 保存您的初始值,并且每次您发出时,所以总是有持久数据.
**如果您每次需要多个值,则应查看回复主题

【讨论】:

  • 您介意提供一些代码来展示您的意思吗?我认为这将使您的答案更加完整...一旦您更新它,我将标记为答案
  • 我更新了更多细节,希望现在更好。祝你好运
  • 感谢您的更新...对于其他人,请查看 cmets 中的 Vikas 链接。
猜你喜欢
  • 2017-11-02
  • 1970-01-01
  • 2016-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多