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()
中绑定了正确的这个值。刚才还补充说,我以前肯定一直在处理它,因为我知道我有它