Node.js Promisify节点中的事件处理程序和超时

Node.js Promisify节点中的事件处理程序和超时,node.js,event-handling,promise,Node.js,Event Handling,Promise,我有一个回调处理程序来处理websocket事件,我正在尝试编写一个函数来返回一个承诺。如果调用处理程序,则应解析承诺;如果未执行处理程序,则应解析承诺。有更好的方法吗 var callbackCalled = false; var message = null; waitForMessage = function() { return new Promise(function(resolve, reject) { setTimeout(function() { if

我有一个回调处理程序来处理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
});

注意,我在这里添加和删除事件侦听器是为了确保它不会被处理太多次或添加太多次,因为事件处理程序是多快照侦听器,但承诺是一次性的。

我认为您可以在这个答案中使用
timeoutFn()
函数:。@learningtocode-如果这对您有效,然后,您可以通过单击答案左侧的绿色复选标记向社区表明您的问题已得到回答。