Rxjs Subject.asObservable () не работает, но BehaviorSubject работает ... почему? - PullRequest
0 голосов
/ 27 июня 2018

Я проверил это https://github.com/angular/angular/issues/12129 но я не вижу никакого решения ...

Angular 2.0.1 AsyncPipe не работает с Rx Subject .

Решением здесь является создание наблюдаемой переменной в компоненте

Который у меня есть, но все еще не работает ... не уверен, почему он не работает, если я переключаю тему в моем UserStateService на Поведение. Тема все работает ...

Примечание: И 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>

Пожалуйста, любые идеи будут отличными, спасибо !!

1 Ответ

0 голосов
/ 27 июня 2018

Субъект не содержит никаких данных, он просто вызывает все, что подписано на него со значением. BehaviorSubject хранит данные, и каждый раз, когда вы вызываете их, он заменяет текущие данные.

Когда вы пытаетесь консоль журнала из вашего сервиса, UserList:
С субъектом он не содержит постоянных данных.

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

...