У меня есть такая служба, которая высмеивает вызов API,
import { Injectable } from '@angular/core';
import { Observable, Subscriber} from 'rxjs';
import { DeviceStatus } from '../models/device-status-model';
@Injectable()
export class GetStatusService {
public deviceStatusObserver: Subscriber<DeviceStatus>;
public deviceStatus: Observable<DeviceStatus>;
constructor() {
this.deviceStatus = new Observable(observer => {
this.deviceStatusObserver = observer;
});
}
getRandom(max): number {
return Math.floor(Math.random() * Math.floor(max));
}
callApi() {
setInterval(() => {
//Mocking data
let status = new DeviceStatus();
status.tempC = this.getRandom(50) + 'C';
status.tempF = this.getRandom(50) + 'F';
status.humidity = this.getRandom(100) + '%';
status.pin1 = true;
status.pin2 = true;
status.pin3 = true;
status.pin4 = true;
this.deviceStatusObserver.next(status);
}, 500);
}
}
И такой компонент
import { Component, OnInit } from '@angular/core';
import { Observable } from 'rxjs';
import { GetStatusService } from '../services/get-status.service';
import { DeviceStatus } from '../models/device-status-model'
@Component({
selector: 'app-layout',
templateUrl: './layout.component.html',
styleUrls: ['./layout.component.css']
})
export class LayoutComponent implements OnInit {
dStatus$: Observable<DeviceStatus>;
humidityValue: string; tempValue: string;
constructor(private getStatusService: GetStatusService) {
this.dStatus$ = getStatusService.deviceStatus;
}
ngOnInit() {
this.getStatusService.deviceStatus.subscribe((data) => {
this.tempValue = data.tempC;
this.humidityValue = data.humidity;
});
this.getStatusService.callApi();
}
}
Я хотел использовать Observable с асинхронным каналом, поэтомуя удалил
this.getStatusService.deviceStatus.subscribe((data) => {
this.tempValue = data.tempC;
this.humidityValue = data.humidity;
});
Затем я начал получать ERROR TypeError: Cannot read property 'next' of undefined
на консоли.Нужно ли мне подписываться на Observable, даже если я использую асинхронный канал?Все учебники, которые я посмотрел, не использовали метод подписчика.
Ссылка на проект в StackBlitz