2017-07-13 21 views
0

专家请告诉我如何在调用类中的其他函数时确保服务构造函数中的异步初始化完成?如何确保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-server的连接在构造函数中建立。之后,邀请这项服务的客户(组件)订阅感兴趣的主题。自然地,在连接完全建立之前,对订阅功能的调用是没有意义的。

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

回答

2

请通过承诺与客户跺脚每一次互动,例如:

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

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

谢谢!在连接建立之前,即使在多次订阅之后,它是否也能工作? –

+0

当然,您可以反复使用promise的then方法,并且每次都会从中获取解析值。 – deceze

+0

这几乎可行。不幸的是,它连接两次这个代码。有没有办法确保Promise中的代码只执行一次? –

相关问题