将WebSocket事件转换为可观察事件

时间:2018-10-10 10:43:50

标签: javascript node.js websocket rxjs observable

我正在使用ws library创建一个websocket客户端来与(基于JSON的)websocket服务器进行通信。每个请求必须具有唯一的requestId,并且响应将具有相同的requestId

我的代码的简化示例

let requestId = 0;

const WebSocket = require('ws');
const ws = new WebSocket('ws://www.host.com/path');

ws.on('message', (json) => {
  let obj = JSON.parse(json);

  if (obj.eventType === 'SomeEvent') {
     ws.send({
       requestId,
       command: "DoSomeStuff"
     });
  }
});

我想在我的文件中实现一个send方法,该方法内部调用ws.send(),但返回一个可观察到的结果,当websocket收到一个ws.on('message')时,解析该请求的请求ID属性与requestId匹配。

这样,我可以订阅Observable并将代码更改为

...
  if (obj.eventType === 'SomeEvent') {
     mySendFunction({
       requestId,
       command: "DoSomeStuff"
     }).subscribe(result => {
        // Do something with result here
     }
  }
...

也-有时(很少)服务器不响应请求。在这种情况下,如果在给定时间内未收到响应,是否有办法使可观察到的时间超时?


我见过使用数组将requestId映射到promise,然后手动解析它们的实现,但是我认为必须有一种更聪明的方法直接使用RxJS来实现。

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

您可以做的一件非常简单的事情就是使用new Observable()

const mySendFunction = options => new Observable(observer => {
  const handler = ws.on('message', json => {
    let obj = JSON.parse(json);

    if (obj.eventType === options.command) {
      observer.next(obj);
      observer.complete();
    }
  });

  ws.send(options);

  return () => {
    // ...cancel handler?
  };
});
相关问题