Я пытаюсь отображать события, отправленные сервером, исходящие значения в угловом приложении 2/RxJs.Использование RxJs и Angular 2 для обработки событий, отправленных сервером
Бэкэнд регулярно отправляет отдельные строки клиенту через события, отправленные сервером.
Я не уверен, как бороться с полученными значениями на угловой стороне 2/RxJs.
Вот мой клиент (нг компонент):
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(this.extractData)
.
Я просто хотел бы добавить входящие строки в массив и вывести этот массив в шаблон, который будет обновлять, как струны бывают.
Может кто-нибудь, пожалуйста, помогите?
редактировать: Здесь рабочий раствор (благодаря ответу Тьерри ниже):
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? Я использую import {Component, OnInit} из '@ angular/core'; и он не находит класс EventSource.Можете ли вы сообщить мне, если вы установили какой-либо другой пользовательский пакет? Был бы признателен, если вы можете поделиться полным кодом в github или так, для справки. Благодарю. – csharpnewbie