gpt4 book ai didi

node.js - Nodejs 中的 Promisify 事件处理程序和超时

转载 作者:太空宇宙 更新时间:2023-11-03 22:51:42 26 4
gpt4 key购买 nike

我有一个回调处理程序来处理 websocket 事件,我正在尝试编写一个返回 promise 的函数。如果调用处理程序,则应解决 promise ;如果处理程序未执行,则应拒绝 promise 。有更好的方法吗?

var callbackCalled = false;
var message = null;

waitForMessage = function() {
return new Promise(function(resolve, reject) {
setTimeout(function() {
if (callbackCalled) {
callbackCalled = false;
message = null;
resolve();
} else {
reject();
}
}, 5000);
});
}

onEvent = function(event) {
console.log("Process the event");
//set the message
callbackCalled = true;
};

最佳答案

你可以使用这样的东西。如果超时发生在传入事件之前,这将被拒绝。如果事件在超时之前发生,它将用数据解析。

function waitForEventWithTimeout(socket, event, t) {
return new Promise(function(resolve, reject) {
var timer;

function listener(data) {
clearTimeout(timer);
socket.removeListener(event, listener);
resolve(data);
}

socket.on(event, listener);
timer = setTimeout(function() {
socket.removeListener(event, listener);
reject(new Error("timeout"));
}, t);
});
}

你可以像这样使用它:

waitForEventWithTimeout(socket, "myEvent", 1000).then(function(data) {
// got data here
}, function() {
// timeout here
});

请注意,我在此处添加和删除事件监听器,以确保它不会被处理太多次或添加太多次,因为事件处理程序是多次监听器,但 Promise 是一次性的。

关于node.js - Nodejs 中的 Promisify 事件处理程序和超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40352682/

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