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:
- 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ụ?
- 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ì?
- 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?
- Các dịch vụ nên đóng/hủy bỏ websocket như thế nào?
Đã 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
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
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