gpt4 book ai didi

javascript - Promisify 基于事件的模式

转载 作者:行者123 更新时间:2023-11-30 13:52:09 27 4
gpt4 key购买 nike

我如何 promise 基于 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 函数中添加我自己的事件发射器和触发事件,然后将 promise 从 doRequest Hook 到该事件,但似乎有点复杂?

最佳答案

Websockets 可以随时双向接收和发送数据,而 Promises 只用一个值解析一次。因此,Promises 可能不是这里的正确工具。

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

添加一个监听message事件的事件监听器,但只监听一次并移除它,发送数据并在message<时解析 事件已被调度。

删除函数,因为这是您正在创建的类的方法

doRequest(data){
return new Promise(resolve => {
this.ws.addEventListener('message', event => {
resolve(event.data);
}, {once: true});
this.ws.send(JSON.stringify(data));
});
}

在您的构造函数中只创建 WebSocket 实例。

constructor(){
this.ws = new WebSocket(...);
}

然后像这样使用它:

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

关于javascript - Promisify 基于事件的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58030661/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com