Вообще-то, слушая событие, как только достаточно легко использовать once
.unbind event после получения сообщения, которое соответствует регулярному выражению
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);
});
}
Где находится "слушатель"? В вашей функции это кажется «неопределенным». И что вы делаете с 'regex'? – Bergi
Я думаю, вы должны просто обещать метод 'once' и делать все остальное с обещаниями. – Bergi
Похоже, вы направились по правильному пути. Но вы не показываете нам код функции «слушателя», поэтому мы не можем видеть, что вы можете делать неправильно. Что не работает в том, что вы пробовали до сих пор? Одна вещь, которую я вижу, это то, что вам нужно «removeListener()», если вы нажмете свой тайм-аут. Мне также непонятно, что вы привязываете правильное значение 'this' в' .bind() '. – jfriend00