Javascript Promisify基于事件的模式

Javascript Promisify基于事件的模式,javascript,events,websocket,Javascript,Events,Websocket,我如何保证基于websocket事件的通信能够像ajax一样工作 constructor(){ this.ws = new WebSocket(...); this.ws.onmessage = (event) => { const data = JSON.parse(event.data); // send data to doRequest }; }, async function doRequest(data){ this.ws.send(JSON

我如何保证基于websocket事件的通信能够像ajax一样工作

constructor(){
  this.ws = new WebSocket(...);
  this.ws.onmessage = (event) => {
    const data = JSON.parse(event.data);
    // send data to doRequest
  };

},

async function doRequest(data){
  this.ws.send(JSON.stringify(data));
  return new Promise((resolve, reject) => {
    // how to wait and get data?
    resolve(data);
  });
}

我想在onmessage函数中添加我自己的事件emmiter和fire事件,然后将doRequest的承诺与该事件挂钩,但似乎有点复杂?

WebSocket可以随时在两个方向上接收和发送数据,而承诺只能用一个值解析一次。因此,承诺可能不是正确的工具

但是,如果您想围绕对一个请求的响应编写一个抽象,那么承诺就非常有意义:

添加一个事件侦听器,该侦听器侦听
消息
事件,但只侦听一次,并在调度
消息
事件时将其删除、发送数据和解析

删除
函数
,因为这是所创建类的
方法

在构造函数中,仅创建
WebSocket
实例

constructor(){
  this.ws = new WebSocket(...);
}
然后像这样使用它:

const socket = new YourWebSocketClass();
socket.doRequest({message: 'hello'}).then(message => {
  const data = JSON.parse(message);
});

你对这个websocket有什么用途?您正在发送/检索什么数据?async完全错误。免责声明和建议是有争议的,这取决于具体的用例。引自javascript.info:“函数前面的“async”一词意味着一件简单的事情:函数总是返回一个承诺。其他值自动包装在一个已解析的承诺中。”当然。因此,将其标记为
async
没有什么错。先生,您是对的。我将删除异步部分。
const socket = new YourWebSocketClass();
socket.doRequest({message: 'hello'}).then(message => {
  const data = JSON.parse(message);
});