Я использовал этот код в своем угловом коде, но на самом деле не понимаю его, потому что видел его на веб-сайте, в нем я:
Создано две службы, которые называются WebSocket Service и NewsFeed
Я знаю, это похоже на безумие, но терпите меня.
Существенные места, которые я не понимаю, включают:
Rx.Subject<MessageEvent>
И как здесь работают наблюдатель и наблюдаемая
В сущности, я пытаюсь создать новостную ленту, используя WebSockets
import { Injectable } from '@angular/core';
import * as io from 'socket.io-client';
import { Observable } from 'rxjs/Observable';
import * as Rx from 'rxjs/Rx';
import { environment } from '../../environments/environment';
@Injectable({
providedIn: 'root'
})
export class WebSocketService {
// Socket Connection
private socket;
constructor() { }
connect(): Rx.Subject<MessageEvent> {
this.socket = io('http://localhost:3000');
/** Define Observable which will observe any incoming messages
from socket.io server */
let observable = new Observable(observer => {
this.socket.on('message',(data) => {
console.log('Recieved message from Websocket Server')
observer.next();
})
return () => {
this.socket.disconnect();
}
});
// We define our Observer which will listen to messages
// from our other components and send messages back to our
// socket server whenever the `next()` method is called.
let observer = {
next: (data: Object) => {
this.socket.emit('message',JSON.stringify(data));
}
};
// Return Rx.Subject which is a combination of both an observable and observer
return Rx.Subject.create(observer,observable);
}
}
Служба новостной ленты
import { Injectable } from '@angular/core';
import { WebSocketService } from './web-socket.service';
import { Observable, Subject } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class NewsFeedService {
feeds: Subject<any>;
constructor(private wsService: WebSocketService) {
this.feeds = <Subject<any>>wsService
.connect()
.map((response: any): any => {
return response;
})
}
sendMsg(msg){
this.feeds.next(msg);
}
}