#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 (), который был более старым синтаксисом