javascript - 如何从 onmessage 回调中创建一个可观察对象?

标签 javascript websocket rxjs

我已经相当习惯 RX 在 .NET 和 Java 中使用它,我希望能够执行以下操作:

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

但是,控制台有以下内容:

未捕获的类型错误:Rx.Observable.fromCallback(websocket.onmessage).map 不是函数

这似乎表明 fromCallback 没有返回 Observable。

我在这里做错了什么?我是否误解了 fromCallback 在做什么,我需要使用 Subject?我不能将一些任意处理程序包装在可观察对象中吗?

最佳答案

你实际上是在寻找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,它从函数原型(prototype)传递对方法的引用。 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));

关于javascript - 如何从 onmessage 回调中创建一个可观察对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32094204/

相关文章:

javascript - 语句之间如何使用逗号运算符?

c# - MessageWebSocket用于连接的URI可以是IP地址,对吗?

python - 如何在此服务器中实现 Websocket 握手?

javascript - X 轴标签与 Highcharts 中柱形图中的工具提示重叠

javascript - 管道 RxJS 可观察到现有主题

angular - subscribe 做什么,它与 Observable 有什么关系?

javascript - Concat 可观察量重用以前的结果

rxjs - 在史诗中的可观察流的开始和结束处发出 Action 的最佳实践方法?

javascript - 路由文件无法在 Express.js 中更新

ruby-on-rails - 通知 ember-data 有关服务器更改的信息