Это плохая практика для генерации событий с обратными вызовами в качестве аргументов в узле?

Это плохая практика для генерации событий с обратными вызовами в качестве аргументов в узле?

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);

Но, конечно, я, возможно, совершенно неправильно понял ваши требования:)

Другие вопросы по тегам