Angular 4 Service方法始终返回未定义的状态,而是可观察的状态

滨水区

我编写了一个与socket.io连接到后端的角度服务。我在_getStripes()方法中正确获取了服务器数据,并将其from()转换为Observable并_LEDs使用最近创建的observable设置了类变量

getStripes()在另一个组件中调用并预订public方法,并每次返回undefined

led.service.ts:

import {Injectable} from '@angular/core';
import * as io from 'socket.io-client';
import {LED} from './led';
import {Observable} from 'rxjs/Observable';
import {from} from 'rxjs/observable/from';

@Injectable()
export class LedService {
  private _io;
  private _LEDs: Observable<LED>;

  constructor() {
    this._io = io('http://localhost:80');
    // Subscribe getStripes Event
    this._io.on('getStripes', this._getStripes);

    // Initial Request Stripes from Server
    this._io.emit('getStripes');
  }

  /**
   * Server Response
   * @param {LED[]} data
   * @private
   */
  private _getStripes(data: LED[]) {
    console.log('Got Stripes: ', data); // works
    this._LEDs = from(data);
  }

  /**
   * Get the current connected LEDStripes
   * @returns {Observable<LED>}
   */
  public getStripes(): Observable<LED> {
    // request latest Stripes
    this._io.emit('getStripes');
    return this._LEDs; // always undefined
  }

  public setStripeColor(name: string, color: string) {
    this._io.emit('setStripeColor', name, color);
  }

}
理查德·马特森

您需要将订阅与发射分开。

订阅将建立管道以接收传入的数据,但发出发送数据。它看起来像是请求/响应样式,因为事件和发出参数是相同的字符串,但是在任何情况下两者之间都存在时间延迟,因此需要事先建立管道。

尝试将主题用于this._LEDS

在服务中

import {Injectable} from '@angular/core';
...
import {Subject} from 'rxjs/Subject';

@Injectable()
export class LedService {
  private _io;
  private _LEDs = new Subject<LED>();
  public LEDs = this._LEDs.asObservable();  // Subscribe to this

  constructor() {
    ...
    // Subscribe getStripes Event
    this._io.on('getStripes', this._getStripes.bind(this) );
    ...
  }

  /**
   * Server Response
   * @param {LED[]} data
   * @private
   */
  private _getStripes(data: LED[]) {
    data.forEach(led => this._LEDs.next(led));
    // OR send the whole array as a single emit if it suits your application better
    //    this._LEDs.next(data);
    // in which case the declaration above would be
    //    private _LEDs = new Subject<LED[]>();
  }

  /**
   * Get the current connected LEDStripes
   * @returns void
   */
  public getStripes(): void {
    // request latest Stripes
    this._io.emit('getStripes');
  }

在组件中

ngOnInit() {
  // subscribe to the LEDs
  this.sub = this.ledService.LEDS.subscribe(leds => {
    // do something with data
  }) 
  // or use the subscription directly in the template
  // with <div> {{ (ledService.LEDS | async) }} </div>
}

getFresh() {
  this.ledService.getStripes();
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将可观察数据存储到全局变量中会在 Angular 4 中返回“未定义”

Angular 4 Router返回未定义

Angular 4 向服务发送消息但返回未定义

Angular 4 实例变量在方法内未定义

Angular 7 - 在可观察中访问服务返回未定义

Angular 4 - 嵌套的 @ViewChild 未定义

Angular:订阅可观察对象时数据未定义

Angular 4 应用状态管理

可观察变量的Angular2 Observable.forkJoin-ReferenceError:未定义可观察

返回可观察到的内部可观察到的可激活Angular 4防护

angular2 / 4可观察的订阅

Angular4 可观察链

订阅可观察的Angular HTTP拦截器,然后返回next.handle但抛出TypeError:您提供了“未定义”

Angular 4 api调用转向json的响应返回未定义

在HTMLButtonElement.onclick Angular 4上未定义函数

Angular4无法读取未定义的属性“列表”

Angular 4管道无法读取未定义的属性“ toLowerCase”

Angular4 +无法读取未定义的属性“ url”

遇到未定义的提供者(angular4)

Angular Universal + Webpack 4:ReferenceError:窗口未定义

Angular 7 NGRX存储具有未定义状态

Angular 4 HTTP请求处于保护状态

Angular 4如何在解析器中返回多个可观察对象

angular4:使用valueChanges的自定义“等于”验证可观察到

角度4可观察到的捕获服务未定义

Angular2可观察到的问题,无法读取未定义的属性“订阅”

Angular 4 UI无法从可观察的订阅更新

Angular 4-可观察到的捕获错误

递归可观察调用中的Angular 4加载树结构