Ich versuche zu verstehen, wie man mit eckigen 4 und websockets arbeitet. In meinen älteren Projekten mit AngularJS (1.x), gefolgt ich diese Anleitung: AngularJs Websocket ServiceAngular 4 RxJs WebSocket
Die Lösung in diesem Handbuch ein Versprechen und eine ID für jede Anforderung innerhalb einer Sammlung zu speichern, so dass, wenn der Server sendet eine Antwort Mit dieser ID kann ich das richtige Versprechen aus der Sammlung abrufen und wählen, "Benachrichtigen" zu verwenden, wenn ich mehr Nachrichten erwarte, und "Auflösen", wenn es sich um eine einmalige Anfrage-Antwort handelt.
In Angular 4 ist es vorzuziehen, mit RxJs Observable/Subject zu arbeiten. Eine grundlegende Verwendung von Websocket kann in diesem Beitrag gefunden werden: Angular (2+) Websockets Tutorial. Aber wie kann ich einen gleichwertigen Mechanismus aus dem ersten Post mit RxJs erreichen?
Das ist mein Ausgangspunkt Service, ist es ein einfaches Echo-Client:
import { Injectable } from '@angular/core';
import { Observable, Subject } from 'rxjs/Rx';
import * as Rx from 'rxjs/Rx';
@Injectable()
export class WebsocketService {
private socketUrl: any = 'wss://echo.websocket.org';
private subject: Rx.Subject<MessageEvent>;
private ws : any;
public messages: Subject<any>;
constructor() {
this.messages = <Subject<any>>this.connect()
.map((response: MessageEvent): any => {
let data = JSON.parse(response.data);
return data;
});
}
connect() : Rx.Subject<MessageEvent> {
if (!this.subject) {
this.subject = this.create(this.socketUrl);
console.log("Successfully connected: " + this.socketUrl);
}
return this.subject;
}
private create(url): Rx.Subject<MessageEvent> {
this.ws = new WebSocket(url);
let observable = Rx.Observable.create(
(obs: Rx.Observer<MessageEvent>) => {
this.ws.onmessage = obs.next.bind(obs);
this.ws.onerror = obs.error.bind(obs);
this.ws.onclose = obs.complete.bind(obs);
return this.ws.close.bind(this.ws);
})
let observer = {
next: (data: Object) => {
if (this.ws.readyState === WebSocket.OPEN) {
this.ws.send(JSON.stringify(data));
}
}
}
return Rx.Subject.create(observer, observable);
}
}
Bitte Quellcode Beispiel für das, was Sie versucht haben. – cgTag
Ich habe meinen Startpunktcode hinzugefügt. – retrobitguy