не удается подписаться на observable

#angular #rxjs

#angular #rxjs

Вопрос:

У меня есть служба DeviceManager, которая загружает список устройств для отслеживания из серверной части. Иногда это может занять некоторое время, поэтому я хочу, чтобы исходный app.component загружал данные. У меня есть вызов моей службы через HttpClient, и я хочу, чтобы app.component подписался на службу. Но компилятор сообщает мне, что я не могу подписаться на тип void, когда я явно возвращаю тип observable. Вот сервис:

 export class DeviceManagerService {
  public deviceDBSubject = new BehaviorSubject<any[]>([]);
  private loadingSubject = new BehaviorSubject<boolean>(false);
  public loading$ = this.loadingSubject.asObservable();

  private deviceDB: Device[];

  constructor(private apiService: ApiService) { }

  getAllDevices() {
    this.loadingSubject.next(true);
    this.apiService.getAllDevices().subscribe( devices => {
      this.deviceDB = devices;
      this.deviceDBSubject.next(this.deviceDB);

      console.log('devices are: ', this.deviceDB);
      this.loadingSubject.next(false);
      return this.deviceDBSubject.asObservable();
    });
  }
}
  

и вот где я пытаюсь вызвать это в своем приложении.component

 const deviceManagerObservable = this.deviceManagerService.getAllDevices();
deviceManagerObservable.subscribe((devices) => {
  this.deviceDB = devices;
  console.log('devices are: ', this.deviceDB);
  this.loadingSubject.next(false);
});
  

Что я делаю не так?

Спасибо…..

Ответ №1:

вы ничего не возвращаете в getAllDevices (), поэтому вы не можете подписаться на это

кроме того, вам нужно сохранить его в качестве observale, чтобы вы не могли использовать .subscribe в getAllDevices() вместо этого вам нужно передать observable с модификаторами

 return this.apiService.getAllDevices().pipe(
   switchMap( devices => {
      this.deviceDB = devices;
      this.deviceDBSubject.next(this.deviceDB);

      console.log('devices are: ', this.deviceDB);
      this.loadingSubject.next(false);
      return this.deviceDBSubject.asObservable();
    }));
  }
  

наверное, вот так

Комментарии:

1. я не уверен, что это такое, но у меня такое чувство, что я что-то забыл

2. да, я забыл pipe (), который был более старым синтаксисом