2017-08-30 75 views
9

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:

  1. 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?
  2. 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?
  3. Web bağlantısının bağlantısı nasıl kesilir? Yeniden bağlantı kurmanın bir yolu var mı?
  4. Servisler nasıl websocket'u kapatmalı/imha etmelidir?
+1

Gönderme saniye içinde kısaltıldı mı? Umarım bir açıklama gelecek. – TSG

+0

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

+1

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

cevap

3
  1. böylece sırayla size muhtemelen (eğer chatService bir örneğini var)

    gibi bir şey olurdu verdi örnekte bağlantı
  2. kapatan gözlemlenebilir aboneliğini iptal edebilirsiniz Reuseability

    let sub = chatService.messages.subscribe(()=>{ 
    // do your stuff 
    }); 
    
    // some where in your code 
    sub.unsubscribe() // this will close the connection 
    
  3. zaten 3

cevap
+0

Cevap # 2'yi detaylandırır mısınız - neden kapanış sonucunu geri döndürmek sadece neden sadece çıkarıp soketi kapatır? İşlev döndüğünde hemen çalışmayacak mı? – TSG

+0

Bind, kapatma işlevini ws ile 'this' olarak döndürür. Çalışmayacak. Abonelikten çıkma işlevi döndürülen işlevi çalıştıracak() – Arin

+0

Bind işlevi burada çalıştırılamıyor https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_objects/Function/bind – Arin