我有一个回调处理程序来处理websocket事件,并且我正在尝试编写一个将返回诺言的函数。如果调用了处理程序,则应解决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 - 在Node.js中 promise 事件处理程序和超时,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40352682/