2015-12-03 1 views
0

Вообще-то, слушая событие, как только достаточно легко использовать 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); 
    }); 
} 
+0

Где находится "слушатель"? В вашей функции это кажется «неопределенным». И что вы делаете с 'regex'? – Bergi

+0

Я думаю, вы должны просто обещать метод 'once' и делать все остальное с обещаниями. – Bergi

+0

Похоже, вы направились по правильному пути. Но вы не показываете нам код функции «слушателя», поэтому мы не можем видеть, что вы можете делать неправильно. Что не работает в том, что вы пробовали до сих пор? Одна вещь, которую я вижу, это то, что вам нужно «removeListener()», если вы нажмете свой тайм-аут. Мне также непонятно, что вы привязываете правильное значение 'this' в' .bind() '. – jfriend00

ответ

0

Существует нулевая причины использовать 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); 
    }); 
} 
Смежные вопросы