我想了解如何使用angular 4和websockets。在我與angularjs(1.x的)舊項目我遵循這個指南: AngularJs Websocket ServiceAngular 4 RxJs WebSocket
本指南中的解決方案是存儲並承諾爲集合內的每個請求的ID,所以當服務器發回一個響應使用這個ID,我可以從集合中檢索正確的Promise,並且如果我期望更多的消息,則選擇使用「notify」;如果是單次請求響應,則選擇「resolve」。
在Angular 4中最好與RxJs Observable/Subject一起工作。 websocket的基本使用可以在這篇文章中找到:Angular (2+) Websockets Tutorial。 但是我怎樣才能實現RxJs的第一篇文章的等價機制?
這是我的出發點服務,這是一個簡單的echo客戶端:
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);
}
}
請提供源代碼示例。 – cgTag
我加了我的起點碼。 – retrobitguy