Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何确保Angular service构造函数中的异步初始化完成?_Javascript_Angular_Typescript_Asynchronous_Rxjs5 - Fatal编程技术网

Javascript 如何确保Angular service构造函数中的异步初始化完成?

Javascript 如何确保Angular service构造函数中的异步初始化完成?,javascript,angular,typescript,asynchronous,rxjs5,Javascript,Angular,Typescript,Asynchronous,Rxjs5,专家们,请告诉我在调用类中的其他函数时,如何确保服务构造函数中的异步初始化完成 constructor() { var sock = new SockJS(this._chatUrl); this.stompClient = Stomp.over(sock); this.stompClient.connect({}, function () { }); } public subscribe(topicName: string, messageRece

专家们,请告诉我在调用类中的其他函数时,如何确保服务构造函数中的异步初始化完成

  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函数的调用是没有意义的

更新:
保持.connect方法只调用一次也很重要。否则会创建两个连接。

通过承诺与stomp客户端进行每次交互,例如:

constructor() {
    ...
    this.stomp = new Promise(resolve => {
        stompClient.connect({}, () => resolve(stompClient));
    });
}

subscribe(...) {
    this.stomp.then(stompClient => stompClient.subscribe(...));
}

通过承诺与stomp客户进行每次互动,例如:

constructor() {
    ...
    this.stomp = new Promise(resolve => {
        stompClient.connect({}, () => resolve(stompClient));
    });
}

subscribe(...) {
    this.stomp.then(stompClient => stompClient.subscribe(...));
}

非常感谢。当很久以前建立连接时,即使在多次订阅之后,它也会工作吗?当然,您可以反复使用promise的then方法,每次都会从中获得解析值。这几乎可以工作。不幸的是,它使用此代码连接了两次。有没有办法确保Promise中的代码只执行一次?此代码不会连接两次,没有。这是您的代码中的一些内容。结果表明,问题是因为angular为每个组件中定义的每个“提供者”创建了实例。为了避免这个问题,我必须在父模块的“提供者”部分定义服务。谢谢非常感谢。当很久以前建立连接时,即使在多次订阅之后,它也会工作吗?当然,您可以反复使用promise的then方法,每次都会从中获得解析值。这几乎可以工作。不幸的是,它使用此代码连接了两次。有没有办法确保Promise中的代码只执行一次?此代码不会连接两次,没有。这是您的代码中的一些内容。结果表明,问题是因为angular为每个组件中定义的每个“提供者”创建了实例。为了避免这个问题,我必须在父模块的“提供者”部分定义服务。谢谢