Это первый раз, когда я пытаюсь заставить сокеты работать.
Я основываю свою службу сокетов на этом учебном пособии .
В основном все сводится кпара сервисов - WebsockService
и DashSocketService
.
Ниже приведен код для них обоих:
import { Injectable } from '@angular/core';
import { Subject, Observable, Observer } from 'rxjs';
@Injectable()
export class WebsockService {
constructor() {}
private ws: WebSocket;
private subject: Subject<MessageEvent>;
public connect(url): Observable<MessageEvent>
{
if (this.subject)
{
this.ws.close();
}
this.subject = this.create(url);
console.log('Successfully connected to: ' + url);
return this.subject.asObservable()
}
public create(url): Subject<MessageEvent>
{
this.ws = new WebSocket(url);
let observable = Observable.create(
(obs: Observer<MessageEvent>) => {
this.ws.onmessage = obs.next.bind(obs);
this.ws.onerror = obs.error.bind(obs);
this.ws.onclose = obs.complete.bind(obs);
return this.ws.close.bind(this.ws);
}
);
let observer = {
next: (data: Object) => {
if (this.ws.readyState === WebSocket.OPEN)
{
this.ws.send(JSON.stringify(data));
}
}
};
return Subject.create(observer, observable);
}
}
@Injectable()
export class DashSocketService {
constructor( private wsService: WebsockService, private globals: Globals)
{
}
public getDashInfoBySocket(filter_hash: string): Observable<Dash>
{
return this.wsService.connect(`${this.globals.WS_URL}/ws/channel/${filter_hash}`).pipe(
map(
res => {
return new Dash().deserialize(JSON.parse(res.data));
}
)
)
}
}
Я не уверен, что код написанправильно, но проблема в том, что, насколько я понимаю, я могу подписаться на этот Observable только один раз.То есть, если позже я получу dash
(который имеет тип Observable
), я могу использовать его только один раз, dash | async
, другие попытки ничего не вернут.
Так что я хотел бы знатькак сделать возможным использовать эту subject.asObservable () как обычную наблюдаемую.