Как сделать так, чтобы Тема излучала несколько раз? - PullRequest
0 голосов
/ 22 апреля 2019

Это первый раз, когда я пытаюсь заставить сокеты работать.

Я основываю свою службу сокетов на этом учебном пособии .

В основном все сводится кпара сервисов - 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 () как обычную наблюдаемую.

1 Ответ

0 голосов
/ 22 апреля 2019

Не видя код, который подписывается, я не могу быть уверен, что это проблема, но я собираюсь выйти на конечность и предположить, что это ...

Проблема не встолько, сколько раз вы можете подписаться, но когда вы подписываетесь.Кажется, что все является Субъектом, и я предполагаю, что сервисы также .... Поэтому любые подписки будут ждать следующего обновления, прежде чем получат значение.По сути, все подписки должны быть сделаны до подписки.Если вам нужны подписчики для получения существующего значения, вам нужно отфильтровать значения через BehaviorSubject.Создайте новый BehaviorSubject, затем подпишитесь на свой существующий Observable, и каждый раз, когда новое значение будет получено, вставляйте его в тему вашего поведения.Затем попросите ваш компонент подписаться на BehaviorSubject (asObservable ()).

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...