Это плохая практика для генерации событий с обратными вызовами в качестве аргументов в узле?
Это плохая практика для генерации событий с обратными вызовами в качестве аргументов в узле?
var someonesListened = self.emit('doSomething', param, callback);
if (!someonesListened) {
callback();
}
// in another module somewhere
this.on('doSomething', function(param, callback) {
// Something async....
// Then sometime later
callback();
})
РЕДАКТИРОВАТЬ: После написания этого вопроса я понял, что, предоставляя продолжение обратного вызова для события, которое может быть перехвачено несколькими слушателями, наносит ущерб цели, поэтому я не думаю, что я буду использовать этот подход.
2 ответа
Нет, это неплохая практика, если ты знаешь, что делаешь.
Но имейте в виду, что этот обратный вызов может вызываться несколько раз или вообще не вызываться в зависимости от количества слушателей. Если вам это нравится, во что бы то ни стало используйте обратные вызовы.
Я пытаюсь читать между строк, но кажется, что у вас есть следующие требования:
- У вас есть обратный вызов, который должен быть запущен ровно один раз.
- Если никто не вызывает обратный вызов, вам нужно сделать это самостоятельно, но...
- ... кто-то другой может вызвать этот обратный вызов асинхронно.
Предполагая, что это так, вы можете использовать такой подход:
// define a callback that will exit early if it has already been invoked,
// AND will invoke itself after a 10 second delay, if no one else has.
var hasRun = false, timeoutId = setTimeout(callback, 10000);
function callback() {
if (hasRun) return;
hasRun = true;
clearTimeout(timeoutId);
// do something cool
}
self.emit('some-event', callback);
Но, конечно, я, возможно, совершенно неправильно понял ваши требования:)