Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将websocket事件转换为可观察事件_Javascript_Node.js_Websocket_Rxjs_Observable - Fatal编程技术网

Javascript 将websocket事件转换为可观察事件

Javascript 将websocket事件转换为可观察事件,javascript,node.js,websocket,rxjs,observable,Javascript,Node.js,Websocket,Rxjs,Observable,我正在使用创建一个websocket客户端来与(基于JSON的)websocket服务器通信。每个请求都必须有一个唯一的requestId,并且响应将具有相同的requestId 我的代码的简化示例 我想在我的文件中实现一个send方法,该方法在内部调用ws.send(),但返回一个可观察值,当websocket接收到一个ws.on('message'),其中requestId属性与requestId匹配时,该可观察值将被解析 这样我就可以订阅Observable并将代码更改为 ... if

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

我的代码的简化示例 我想在我的文件中实现一个send方法,该方法在内部调用
ws.send()
,但返回一个可观察值,当websocket接收到一个
ws.on('message')
,其中requestId属性与requestId匹配时,该可观察值将被解析

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

...
  if (obj.eventType === 'SomeEvent') {
     mySendFunction({
       requestId,
       command: "DoSomeStuff"
     }).subscribe(result => {
        // Do something with result here
     }
  }
...
此外-有时(很少)服务器不响应请求。在这种情况下,如果在给定的时间段内没有收到响应,是否有办法使可观察到的超时


我见过使用数组将requestId映射到承诺,然后手动解析它们的实现,但我认为必须有一种更智能的方法直接使用RxJS来实现这一点


有什么想法吗?

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


因此,您首先要调用
send
,然后在
上通过
等待回复?似乎rxjs 5和6已经
...
  if (obj.eventType === 'SomeEvent') {
     mySendFunction({
       requestId,
       command: "DoSomeStuff"
     }).subscribe(result => {
        // Do something with result here
     }
  }
...
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?
  };
});