2016-03-29 12 views
0

Ich verwende einen Standard-WebSocket, der Nachrichten sendet und eventuell eine Antwort erhält. Zuvor habe ich $q.defer verwendet, das verzögerte Objekt gespeichert und eine Zusage zurückgegeben. Der Antworthandler würde das gespeicherte verzögerte Objekt nachschlagen und es unter Verwendung eines Werts auflösen.Defer Observables

Ist dies mit Observablen möglich?

// 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

nicht das Rad neu erfinden Sie, RxJS bereits WebSockets unterstützen. –

Antwort

2

Ich würde Ihren Code auf diese Weise Refactoring:

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

und die Möglichkeit, Nachrichten zu senden und zu empfangen sowie:

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) 
    }, 
() => { 
    } 
); 

Im Gegensatz zu Versprechungen, muss Observablen sein Einmal initialisieren, da sie Ereignisse unterstützen. Jedes Mal, wenn eine Nachricht gesendet wird, wird der Ereignisrückruf (der erste Parameter der Methode subscribe) mit der Nachricht als Parameter aufgerufen.

Weitere Einzelheiten könnten Sie haben einen Blick auf den folgenden Artikel im Abschnitt "Event-basierte Unterstützung":