RxJS'yi websockets ve Angular 4 ile öğrenmeye çalışıyorum ve iyi bir örnek buldu here. Birisinin birkaç şeyi kafa karıştırıcı olduğu için örneği açıklamaya yardımcı olabileceğini umuyorum.Açısal 4 ve RxJS karışıklığında Websocket
Onlar 2 Açısal hizmetleri, WebSocket'e Servisi yarattık:
import { Injectable } from '@angular/core';
import * as Rx from 'rxjs/Rx';
@Injectable()
export class WebsocketService {
constructor() { }
private subject: Rx.Subject<MessageEvent>;
public connect(url): Rx.Subject<MessageEvent> {
if (!this.subject) {
this.subject = this.create(url);
console.log("Successfully connected: " + url);
}
return this.subject;
}
private create(url): Rx.Subject<MessageEvent> {
let ws = new WebSocket(url);
let observable = Rx.Observable.create(
(obs: Rx.Observer<MessageEvent>) => {
ws.onmessage = obs.next.bind(obs);
ws.onerror = obs.error.bind(obs);
ws.onclose = obs.complete.bind(obs);
return ws.close.bind(ws);
})
let observer = {
next: (data: Object) => {
if (ws.readyState === WebSocket.OPEN) {
ws.send(JSON.stringify(data));
}
}
}
return Rx.Subject.create(observer, observable);
}
}
ve Sohbet servisini:
import { Injectable } from '@angular/core';
import { Observable, Subject } from 'rxjs/Rx';
import { WebsocketService } from './websocket.service';
const CHAT_URL = 'ws://echo.websocket.org/';
export interface Message {
author: string,
message: string
}
@Injectable()
export class ChatService {
public messages: Subject<Message>;
constructor(wsService: WebsocketService) {
this.messages = <Subject<Message>>wsService
.connect(CHAT_URL)
.map((response: MessageEvent): Message => {
let data = JSON.parse(response.data);
return {
author: data.author,
message: data.message
}
});
}
}
Bu konuda bir dizi soru var:
- 2 hizmet oluşturmak neden gereklidir? Bir Konu bir gözlemci olamaz ve gözlemlenebilir (bu yüzden mesajları doğrudan ikinci bir Sohbet servisi olmadan yönlendirebilir)? 2 hizmet yaratmada hangi problem çözülür?
- Websocket Service'de, .create işlev çağrısının son satırı neden ws.close.bind (ws) döndürüyor? Bu ne yapar?
- Web bağlantısının bağlantısı nasıl kesilir? Yeniden bağlantı kurmanın bir yolu var mı?
- Servisler nasıl websocket'u kapatmalı/imha etmelidir?
Gönderme saniye içinde kısaltıldı mı? Umarım bir açıklama gelecek. – TSG
Tüm bu soruları aklınızda bulunduruyorsanız, bu örneğin iyi bir örnek olduğunu düşündüren nedir? :-). Bana göre, basit yaklaşımlar her zaman daha iyidir: https://stackoverflow.com/questions/37025837/the-best-way-to-share-websocket-data-between-multiple-components-in-angular-2/37027309# 37027309 (her iki cevap da basit ve kullanışlıdır). Btw, downvote'un sebebi, bu şekilde işaretlendiği için çok geniş bir sorudur, çünkü temelde çok geniş, belirli bir cevap beklemediğiniz 4'üncü soru sormuştunuz (aynı zamanda akılsızca düşüşten nefret ediyorum). – echonax
Websocket + RxJS + ng2 belgeleri açısından ÇOK KÜÇÜK var. Bu bulabildiğim en basit örnek ... bu yüzden onu anlamaya çalışıyorum. Ayrı ayrı parçaları araştırdım, ama bazıları henüz mantıklı değil – TSG