等待通过 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 的承诺的主要内容,如果未能解决你的问题,请参考以下文章