Я думаю, что оба способа хороши, и ни один из них не имеет большого преимущества перед другим.
Например, пользовательский интерфейс jQuery использует обратный вызов для параметров и триггеры событий для фактических событий, таких как перетаскивание при запуске / остановке.
Но, создавая триггеры событий в коде, вы можете создать более гибкий способ добавления большего числа обработчиков событий без изменения существующего кода. Я имею в виду, когда вы получили обратные вызовы, это происходит следующим образом:
{onComplete: function(someData){ action_1; }}
Если вам нужны дополнительные действия, вы записываете их в функцию existion или помещаете функции внутрь:
{onComplete: function(){ action_1; action_2 }}
или
{onComplete: function(){ action_1; function_2(); }}
function_2(){ action_2 };
Для сравнения с использованием событий это будет выглядеть так:
$('selector').on('myplugin_completed.myplugin', function_1 })
Дополнительные действия:
$('selector').on('myplugin_completed.myplugin_extra', function_2 })
Если вам не нужны какие-либо действия, вы можете отменить привязку только к ним.
$('selector').off('myplugin_completed.myplugin_extra');
Между ними есть различия, но обычно это зависит от конкретной ситуации, какая из них лучше;