2017-07-13 7 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)); 
    } 

ご覧のとおり、ストンプサーバーへの接続はコンストラクタで確立されています。その後、このサービスの顧客(コンポーネント)は興味のあるトピックを購読するように招待されます。当然のことながら、サブスクライブ関数への呼び出しは、接続が完全に確立されるまで意味をなさない。

更新: .connectメソッドを1回だけ呼び出すことも重要です。そうでなければ、2つの接続を作成します。

答えて

2

約束を通じてストンプクライアントとのすべての対話を行い、例えば:

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

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

ありがとうございました!それはまた、接続が確立された後も複数のサブスクリプションの後でも動作しますか? –

+0

確かに、promiseの 'then'メソッドを何度も何度も使うことができ、毎回解決された値を得るでしょう。 – deceze

+0

これはほとんど動作します。残念ながら、このコードで2回接続します。 Promiseのコードが一度だけ実行されるようにする方法はありますか? –

関連する問題