2015-08-19 44 views
2

我相當用於RX已經用它在.NET和Java,我期待着能夠做到以下幾點:如何從onmessage回調創建observable?

Rx.Observable.fromCallback(websocket.onmessage) 
    .map(...) 
    .subscribe(...); 
然而

,控制檯有以下幾點:

Uncaught TypeError: Rx.Observable.fromCallback(websocket.onmessage).map is not a function

這似乎表明fromCallback沒有返回Observable。

我在這裏做錯了什麼?我誤解了fromCallback正在做什麼,我需要使用Subject?我可以不包裝一些可觀察的任意處理程序嗎?

回答

8

你實際上是在尋找fromEventfromEventPattern

Rx.Observable.fromEvent(websocket, 'message').map(/*...*/).subscribe(); 

Rx.Observable.fromEventPattern(
    function add(h) { websocket.addEventListener(h); }, 
    function remove(h) { websocket.removeEventListener(h); }) 
.map(/*...*/) 
.subscribe(); 

第一個將嘗試使用一些訂閱的事件發射器,它的WebSocket是標準的方式。但是,如果失敗,則可以使用fromEventPattern來指定如何將處理程序添加到對象中或從中刪除。

,還應注意,JavaScript不沿隱式引用您正在使用C#和Java的執行對象的實例傳遞,那麼你的代碼fromCallback(websocket.onmessage)不沿websocket傳遞,它是沿着引用傳遞到方法來自函數原型。 this將在執行時間確定。

Rx.Observable.fromCallback適用於最後一個參數爲回調函數的函數,該函數是異步JavaScript代碼的標準模式。此外,fromCallback方法不返回Observable它返回一個函數,當被調用時返回Observable,即

function methodWithCallback(arg0, arg1, cb) { 
    setTimeout(function() { 
    cb(arg0 + arg1); 
    }, 2000); 
} 

var newMethod = Rx.Observable.fromCallback(methodWithCallback); 

//[After 2 seconds] 3 
newMethod(1, 2).subscribe(console.log.bind(console));