我很习惯RX在.NET和Java中使用它,我希望能够做到以下几点:
Rx.Observable.fromCallback(websocket.onmessage)
.map(...)
.subscribe(...);
但是,控制台具有以下内容:
Uncaught TypeError: Rx.Observable.fromCallback(websocket.onmessage).map is not a function
似乎表明fromCallback
没有返回Observable。
我在这里做错了什么?我误解了fromCallback
正在做什么,我需要使用Subject
吗?我可以不在一个observable中包含一些任意的处理程序吗?
答案 0 :(得分:10)
您实际上在寻找fromEvent
或fromEventPattern
:
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));