等待通过 websocket 的承诺

Posted

技术标签:

【中文标题】等待通过 websocket 的承诺【英文标题】:Awaiting a promise across a websocket 【发布时间】:2021-07-08 18:36:33 【问题描述】:

我需要能够通过 websocket 发送请求并等待它们链接典型查询。

因为 websocket 不会立即发送响应,所以我使用 websocket 上的 onmessage 属性来监听响应。每个请求都带有一个唯一的 ID,以便在收到响应时可以将其映射回发送它的请求。

所以现在,代码看起来或多或少是这样的

_requests = new Map();
 
public exec(req) 
  req = 
    payload: /* stuff */
    request_id: /* unique ID */
  ;
  _requests.set(req.request_id, /*some_callback like () =>  */)
  ws.send(req)


// receive
public receive() 
  ws.onmessage = (e) => 
    response = e.data
    requestId = response.request_id
  
    callback = this._requests(requestId)
    callback(response) 

    this._requests.delete(requestId)

这是不完整的...因为我希望 exec 返回一个承诺,即当从请求数据的组件调用时我可以 await

【问题讨论】:

【参考方案1】:

我最终做了类似的事情:

// send
public exec(req) 
  return new Promise((resolve, reject) => 
     this._requests.set(req.request_id,
        (resp) => 
           if (resp.error) 
             reject(resp)
            else 
             resolve(resp)
           
        
  

// listener
public onReceive() 
  ws.onmessage = (e) => 
    var callback = this._requests.get(response.request_id)
    callback(e.data)
  

【讨论】:

【参考方案2】:

您正在寻找基于承诺的异步通信。

解决方案:为了实现这一点,我们必须实现一个请求-响应机制。每个请求都有一个唯一的 id,并等待来自具有相同 id 的 WebSocket 服务器的响应。

我已经编写了一个小的 javascript 模块来以一种非常干净和简单的方式实现这一点。

我称之为“linka”,https://github.com/pathikdevani/linka

【讨论】:

以上是关于等待通过 websocket 的承诺的主要内容,如果未能解决你的问题,请参考以下文章

Tornado websocket 客户端:如何异步 on_message? (从未等待协程)

websock第一次连不上window

015_NGINX作为WebSocket Proxy的设置

初识Websocket

websocke

websocke前世今生