Не удается прочитать свойство 'next' из неопределенного при использовании асинхронного канала - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть такая служба, которая высмеивает вызов 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

1 Ответ

0 голосов
/ 06 декабря 2018

Наконец-то разобрался,

изменен, добавлен нулевой чек в callApi()

  callApi() {
    setInterval(() => {
      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;
      if(!this.deviceStatusObserver)
        return;
      this.deviceStatusObserver.next(status);
    }, 500);
  }
...