【问题标题】:Awaiting a promise across a websocket等待通过 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

【问题讨论】:

    标签: angular websocket


    【解决方案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

      【讨论】:

        猜你喜欢
        • 2020-08-16
        • 2013-09-16
        • 2019-04-29
        • 2020-10-31
        • 2019-12-10
        • 1970-01-01
        • 1970-01-01
        • 2021-08-29
        • 2020-07-19
        相关资源
        最近更新 更多