10

angular 2 /RxJsアプリでサーバー送信イベントの値を表示しようとしています。

バックエンドは、サーバー送信イベントを通じて、個々の文字列を定期的にクライアントに送信します。

angular 2/RxJs 側で取得した値を処理する方法がわかりません。

これが私のクライアントです(ngコンポーネント):

import {Component, OnInit} from 'angular2/core';
import {Http, Response} from 'angular2/http';
import 'rxjs/Rx';
import {Observable}     from 'rxjs/Observable';

@Component({
    selector: 'my-app',
    template: `<h1>My second Angular 2 App</h1>
    <ul>
        <li *ngFor="#s of someStrings | async">
           a string: {{ s }}
        </li>
    </ul>
    `
})
export class AppComponent implements OnInit {

    constructor(private http:Http) {
    }

    errorMessage:string;
    someStrings:string[];

    ngOnInit() {
        this.getSomeStrings()
            .subscribe(
                aString => this.someStrings.push(aString),
                error => this.errorMessage = <any>error);
    }

    private getSomeStrings():Observable<string> {
        return this.http.get('interval-sse-observable')
            .map(this.extractData)
            .catch(this.handleError);
    }

    private extractData(res:Response) {
        if (res.status < 200 || res.status >= 300) {
            throw new Error('Bad response status: ' + res.status);
        }
        let body = res.json();
        return body || {};
    }

    private handleError(error:any) {
        // In a real world app, we might send the error to remote logging infrastructure
        let errMsg = error.message || 'Server error';
        console.error(errMsg); // log to console instead
        return Observable.throw(errMsg);
    }
}

バックエンド メソッドは次のとおりです (RxJava を使用します)。

   @ResponseStatus(HttpStatus.OK)
   @RequestMapping(method = RequestMethod.GET, path = "interval-sse-observable")
    public SseEmitter tickSseObservable() {
        return RxResponse.sse(
                Observable.interval(5, TimeUnit.SECONDS, Schedulers.io())
                        .map(tick -> randomUUID().toString())
        );
    }

リクエストでアプリがハングアップし、ページに何も表示されないことに気付きました。

map メソッドの使用に問題があると思われます.map(this.extractData)

着信文字列を配列に追加し、その配列をテンプレートに表示して、文字列が着信すると更新されるようにしたいと思います。

誰でも助けてもらえますか?

編集:これが実用的な解決策です(以下のThierryの回答に感謝します):

import {Component, OnInit} from 'angular2/core';
import 'rxjs/Rx';

@Component({
    selector: 'my-app',
    template: `<h1>My second Angular 2 App</h1>
    <ul>
        <li *ngFor="#s of someStrings">
           a string: {{ s }}
        </li>
    </ul>
    `
})
export class AppComponent implements OnInit {

    someStrings:string[] = [];

    ngOnInit() {
        let source = new EventSource('/interval-sse-observable');
        source.addEventListener('message', aString => this.someStrings.push(aString.data), false);
    }
}
4

3 に答える 3

10

XHR オブジェクトに基づいているため、Angular2 の Http クラスを使用してサーバー側のイベントを処理することはできません。

EventSource オブジェクトを活用できます。

var source = new EventSource('/...');
source.addListener('message', (event) => {
  (...)
});

次の記事を参照してください。

于 2016-04-23T19:10:01.727 に答える