2017-08-30 35 views
9

Tôi đang cố gắng tìm hiểu RxJS với websockets và Angular 4, và tìm thấy một ví dụ tốt here. Tôi hy vọng ai đó có thể giúp giải thích ví dụ như một vài điều khó hiểu.Websocket trong Angular 4 và RxJS nhầm lẫn

Họ đã tạo ra 2 dịch vụ kiễu góc, Sở WebSocket:

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); 
    } 

} 

và các dịch vụ Chat:

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 
       } 
      }); 
    } 
} 

Tôi đã có một số câu hỏi về vấn đề này:

  1. Tại sao cần tạo 2 dịch vụ? Subject không thể là một người quan sát và có thể quan sát được (vì vậy nó có thể chuyển tiếp các tin nhắn trực tiếp mà không cần một dịch vụ Chat thứ hai)? Vấn đề gì là giải quyết việc tạo ra 2 dịch vụ?
  2. Trong dịch vụ Websocket, tại sao dòng cuối cùng của hàm gọi hàm .create trả về ws.close.bind (ws)? Cái đó làm cái gì?
  3. Cách ngắt kết nối của websocket được xử lý? Có cách nào để kết nối lại không?
  4. Các dịch vụ nên đóng/hủy bỏ websocket như thế nào?
+1

Đã bỏ phiếu trong vòng vài giây sau khi đăng? Tôi hy vọng một lời giải thích sắp tới. – TSG

+0

Nếu bạn có tất cả những câu hỏi này trong đầu, điều gì khiến bạn nghĩ rằng ví dụ này là một ví dụ hay? :-). Đối với tôi, các cách tiếp cận đơn giản cơ bản luôn tốt hơn: https://stackoverflow.com/questions/37025837/the-best-way-to-share-websocket-data-between-multiple-components-in-angular-2/37027309# 37027309 (cả hai câu trả lời đều đơn giản và hữu ích). Btw, lý do cho downvote rõ ràng là câu hỏi quá rộng vì nó được gắn cờ theo cách đó bởi vì bạn đã hỏi 4 trong 1 câu hỏi mà bạn mong đợi một câu trả lời rất rộng, không phải là một câu trả lời cụ thể (tôi cũng ghét downvotes vô lý). – echonax

+1

Có VERY LITTLE trong điều khoản của tài liệu cho websocket + RxJS + ng2 vì vậy tôi đang bị mắc kẹt nhìn vào ví dụ. Đây là ví dụ đơn giản nhất tôi có thể tìm thấy .... vì vậy tôi đang cố gắng hiểu nó. Tôi đã nghiên cứu các phần riêng lẻ, nhưng một số không có ý nghĩa nhưng – TSG

Trả lời

3
  1. Reuseability
  2. vì vậy bạn có thể hủy đăng ký từ quan sát được do đó đóng kết nối
  3. trong ví dụ bạn đưa nó có lẽ sẽ là một cái gì đó tương tự (khi bạn có một thể hiện của chatService)

    let sub = chatService.messages.subscribe(()=>{ 
    // do your stuff 
    }); 
    
    // some where in your code 
    sub.unsubscribe() // this will close the connection 
    
  4. đã trả lời trong 3

+0

Bạn có thể xây dựng trên câu trả lời # 2 - tại sao sẽ trả về kết quả đóng chỉ chỉ đóng socket khi hủy đăng ký? Sẽ không chạy ngay lập tức khi chức năng trả về? – TSG

+0

Bind trả về hàm đóng với w là 'this'. Nó sẽ không chạy nó. Hủy đăng ký sẽ chạy hàm trả về gần() – Arin

+0

Ràng buộc không chạy chức năng xem tại đây https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_objects/Function/bind – Arin