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为每个组件中定义的每个“提供者”创建了实例。为了避免这个问题,我必须在父模块的“提供者”部分定义服务。谢谢