2016-03-29 17 views
0

メッセージを送信し、最終的に応答を受け取る標準​​WebSocketを使用しています。以前は$q.deferを使用し、遅延オブジェクトを保存して約束を返しました。レスポンスハンドラは、格納されている遅延オブジェクトをルックアップし、値を使用して解決します。Observablesを延期する

これは観測可能で可能ですか?

// As part of the websocket setup 
websocket.onmessage = function(message) { 
    uuid = message.someResponse.uuid; 
    this._observables[uuid].create(function(observer) { 
     observer.onNext(response); 
     observer.onCompleted(); 
    }); 
} 

public sendRequest(request : any) : Observable<any> { 
    this.sendMessage(request); 
    return this._observables[request[Object.keys(request)[0]].uuid] = new Observable(); 
} 

// Inside some requesting method 
var observable = this.sendRequest(request); 
observable.subscribe(
    response => console.log(response), 
    response => console.log(response.error), 
    () => { 
     delete this._callbacks[uuid]; 
    } 
); 
+0

はRxJSが既にWebSocketををサポートし、車輪の再発明をしないでください。 –

答えて

2

私はこのようにコードをリファクタリングします:

public initialize() : Observable<any> { 
    return Observable.create(observer => { 
    websocket.onmessage = function(message) { 
     uuid = message.someResponse.uuid; 
     observer.next(message); 
    } 
    }); 
} 

および送信する方法と同様のメッセージを受け取った:約束に反して

var observable = initialize(); 

var request = (...) 
this.sendRequest(request); 

observable.subscribe(
    message => { 
    // called each time a message is received 
    console.log(message) 
    }, 
    response => { 
    console.log(response.error) 
    }, 
() => { 
    } 
); 

を、観測があることが必要イベントをサポートしているので、一度初期化してください。メッセージが送信されるたびに、イベントコールバック(subscribeメソッドの最初のパラメータ)がパラメータとしてメッセージとともに呼び出されます。あなたはセクションの次の記事を見て、「イベントベースのサポート」を持つことができ、より詳細について