Nodejs 中的 Promisify 事件处理程序和超时

2024-01-06

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

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 是一次性的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Nodejs 中的 Promisify 事件处理程序和超时 的相关文章

随机推荐