使用rxjs中的Observer / Observable

时间:2017-02-01 04:56:08

标签: rxjs

我正在尝试创建一个Observable和Observer,如下所示

我希望这会在观察者上触发onNext。这就是我的理解。

如果这种理解可以,请告诉我?因为它没有这样工作。

Psuedo代码:

@Injectable()
export class HeroService {

    static eventname = [];
    static observable:Observable<string[]>;
    constructor() { this.init(); }

    init() {
        subscribe();
        eventhandler = function (name) {
            HeroService.eventname.push(name);
        };
    }

    subscribe(): void {
       HeroService.observable = Observable.of (HeroService.eventname);

        var observer = {
            next: x => console.log('Observer got a next value: ' + x),
            error: err => console.error('Observer got an error: ' + err),
            complete: () => console.log('Observer got a complete notification'),
        };
         HeroService.observable.subscribe (observer);
    }     
}

当调用eventhandler时,我将新事件添加到eventname。 我期望观察者会被召唤。但在检查时,我发现没有订户。数组是lenth 0

eventHandler由WebSocket / SignalR Hub从服务器调用。

2 个答案:

答案 0 :(得分:0)

您需要订阅您的观察信息。

this.observable.subscribe(observer);

从本教程中了解更多信息:https://egghead.io/lessons/rxjs-creating-observable-from-scratch

答案 1 :(得分:0)

看起来你期望HeroService.observable = Observable.of (HeroService.eventname);“观察”事件名称数组。那不是真的如何运作。某些东西必须发出(或接下来)该值。

而不是尝试使用观察者和观察者而不是尝试使用主题。确保仅显示主题的可观察部分。

这样的事情:

import { Component, OnInit } from '@angular/core';
import { Subject, Observable } from 'rxjs';

@Component({
    selector: 'home',
    template: require('./home.component.html')
})
export class HomeComponent {
    private eventNames = [];
    private eventListSubject: Subject<string[]> = new Subject<string[]>();

    constructor() {
    }

    get eventList(): Observable<string[]> {
        return this.eventListSubject;
    }

    ngOnInit() {
        this.eventList.subscribe(
            (x) => console.log('Observer got a next value: ' + x),
            (err) => console.error('Observer got an error: ' + err),
            ()=> console.log('Observer got a complete notification')
        );
    }

    eventHandler(name: string): Function {
        return (name) => {
            this.eventNames.push(name);
            this.eventListSubject.next(this.eventNames);
        }
    }
}