Несколько подписаться на один Rx.Subject - PullRequest
0 голосов
/ 24 сентября 2018

Я пытаюсь создать наблюдаемое с помощью Rx.Subject, которое будет подписываться несколькими компонентами.

У меня есть WebsocketService:

export class WebsocketService {
private ws = null;
private subject: Rx.Subject<{}>;

constructor() {
}

public connect(url): Rx.Subject<{}> {
    if (!this.subject) {
        this.subject = this.create(url);
        console.log('Successfully connected: ' + url);
    } else {
        console.log('Already connected: ' + url);
    }
    return this.subject;
}

private create(url): Rx.Subject<MessageEvent> {
    if (this.ws === null) {
        console.log('Connected to WS');
        this.ws = new WebSocket(url);
    } else {
        console.log('Already connected to WS');
    }

    const observable = Rx.Observable.create(
        (obs: Rx.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);
        });

    return Rx.Subject.create({}, observable);
}
}

И два компонента, которые подписываются внутри одинаковым образом:

// ...
constructor(private stationService: StationService, private websocketService: WebsocketService) {

    websocketService.connect('ws://localhost:8080/ws')
        .subscribe(msg => {
            console.log(msg);
            console.log('[Dashboard] Response from websocket: ' + msg.data);
        });
}
// ...

И второе:

// ...
constructor(private http: HttpClient, private websocketService: WebsocketService) {

    websocketService.connect('ws://localhost:8080/ws')
        .subscribe(msg => {
            console.log(msg);
            console.log('[Station] Response from websocket: ' + msg.data);

        });
}
// ...

Мы обновляем, два компонента вызывают мою службу:

Подключено к WS websocket.service.ts: 26: 12 Успешно подключено: ws: // localhost: 8080 / ws websocket.service.ts: 17: 12 Уже подключено: ws: // localhost: 8080 / ws

Но когда я отправляю что-то одно сокет, яесть только один подписчик, который отвечает:

[Dashboard] Ответ от websocket: qwerty

Кто-то, кто позвонил, поможет мне найти мою ошибку?

Спасибо,

1 Ответ

0 голосов
/ 25 сентября 2018

Спасибо, Бене.

Я просто изменяю:

    const observable = Rx.Observable.create(
         (obs: Rx.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);
    });

    return Rx.Subject.create({}, observable);

На:

    const observable = new Subject<MessageEvent>();

    this.ws.onmessage = (msg) => observable.next(msg);
    this.ws.onerror = (err) => observable.error(err);
    this.ws.onclose = () => observable.complete();

    return observable;

И это работает!

Если у кого-то естьподробнее о том, почему первое решение не сработало, дайте мне знать.

...