@godyear

Как убедиться что ассинхронная инициализация в конструкторе сервиса Angular завершена?

Знатоки, подскажите пожалуйста, как убедиться, что асинхронная инициализация в конструкторе сервиса завершенна при вызове других функций в классе?

Пример кода:
constructor() {
    var sock = new SockJS(this._chatUrl);
    this.stompClient = Stomp.over(sock);
    this.stompClient.connect({}, function () {
    });
  }

  public subscribe(topicName: string, messageReceived) {
    this.stompClient.subscribe('/topic/' + topicName, function (message) {
      messageReceived(message);
    })
  }

  public sendMessage(msgDestId: string, message) {
    this.stompClient.send("/app/" + msgDestId, {}, JSON.stringify(message));
  }

Как видите, в конструкторе устанавливается соединение с stomp-сервером. После чего, клиентам (компонентам) этого сервиса предлагается подписаться на интересующие топики. Естественно, что вызов функции subscribe не имеет смысла пока соединение полностью не установленно.
  • Вопрос задан
  • 309 просмотров
Пригласить эксперта
Ответы на вопрос 2
Negwereth
@Negwereth
lvivcss.com.ua
Конструктор не должен быть асинхронным. Проводите инициализацию отдельным методом, на который уже давайте возможность подписаться.
Ответ написан
alexiusp
@alexiusp
senior frontend developer
1. Как правильно заметили в предыдущем ответе - конструктор не должен быть асинхронным. Вынесите инициализацию в отдельный метод.

2. Почему нельзя подписывать до установления соединения? Кто это сказал? Я не знаю, насчёт используемого вами клиента, но можно же свой Subject (из RxJs) объявить, на него подписаться, а он уже будет прокидывать события из сокета, когда соединение установится. Т.е. на события сокета подписывается только сервис, который его создал, после того, как соединение будет установлено. Все остальные подписываются на события этого сервиса. Сервис пробрасывает все события, которые приходят от сокета, своим подписчикам.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы