Javascript 接收到与正则表达式匹配的消息后取消绑定事件

Javascript 接收到与正则表达式匹配的消息后取消绑定事件,javascript,node.js,asynchronous,promise,Javascript,Node.js,Asynchronous,Promise,通常情况下,只要使用一次就可以轻松地监听一次事件 mySocket.once('connect', () => console.log('connected!')); 我试图做的是监听与正则表达式匹配的数据。当接收到匹配的数据时,我希望解除事件侦听器的绑定并使用消息进行解析。我找不到任何简单的方法来做这件事。我希望在函数末尾返回一个承诺,这是我的一个尝试: listenOnce(regex) { let listener; let timeoutId; return new

通常情况下,只要使用一次
就可以轻松地监听一次事件

mySocket.once('connect', () => console.log('connected!'));
我试图做的是监听与正则表达式匹配的数据。当接收到匹配的数据时,我希望解除事件侦听器的绑定并使用消息进行解析。我找不到任何简单的方法来做这件事。我希望在函数末尾返回一个承诺,这是我的一个尝试:

listenOnce(regex) {
  let listener;
  let timeoutId;
  return new Promise((resolve, reject) => {
    timeoutId = setTimeout(() => reject(new Error('Timeout exceeded')), 60000);
    listener = function (data, resolve, reject) {
      if (regex.test(data.toString('ascii'))) {
        resolve(data.toString('ascii'));
      }
    }.bind(this, resolve, reject);
    this.socket.on('data', listener);
  }).then(() => {
    this.socket.removeListener('data', listener); // this doesn't work
    clearTimeout(timeoutId);
  });
}

这里没有理由使用
bind
——让闭包完成它的工作。当前代码不起作用,因为
bind
绑定的是第一个参数,而不是最后一个参数,因此
data
将不是数据

function listenOnce(regex) {
  let listener, timeoutId;
  return new Promise((resolve, reject) => {
    timeoutId = setTimeout(() => reject(new Error('Timeout exceeded')), 60000);
    listener = (data) => {
      const str = data.toString('ascii');
      if (regex.test(str))
        resolve(str);
    };
    this.socket.on('data', listener);
  }).finally(() => {
    this.socket.removeListener('data', listener);
    clearTimeout(timeoutId);
  });
}

侦听器在哪里定义?您的函数中似乎有
未定义的
。你在用
regex
做什么?我认为你应该承诺
一次
方法,然后用承诺做其他事情。看起来你走的是正确的道路。但是,您没有向我们显示
侦听器
函数代码,因此我们无法真正看到您可能在那里做错了什么。到目前为止,您尝试过的方法中有什么不起作用?我看到的一件事是,如果超时,您需要
重新设置Listener()
。我也不清楚您是否在
.bind()
中绑定了正确的
这个
值。刚才还补充说,我以前肯定一直在处理它,因为我知道我有它