События Javascript и обратные вызовы в сценарии MVC
Я пытаюсь разработать отличный способ иметь представления и контроллеры и минимизировать связи между ними.
Помимо нескольких подписчиков на одно событие, существует ли какое-либо существенное различие между js-кодом следующим образом:
var customers = {
get: function(callback) {
$.get('/customers', {}, function(data) {
callback.call(this, data);
});
}
};
И такой подход, подобный событиям (объект события - это просто псевдокод):
var customers = {
get: function() {
$j.get('/customers', {}, function(data) {
event.publish('customers.loaded', data);
});
}
};
В обоих случаях потребитель объекта клиента не знает своих внутренних разработок. Имеет ли один способ преимущество над другим?
Ответы
Ответ 1
Событие - это обратные вызовы, но разница заключается в том, когда и где они связаны. В первом случае вам нужно иметь ссылку на обратный вызов в момент вызова get
, кроме того, он ограничивается одним обратным вызовом.
Во втором сценарии (предполагая, что вы запускаете событие с этим псевдокодом) вы могли бы связать обратный вызов вне области действия, где вызывается get
, что обеспечивает более сильную инкапсуляцию данных. Кроме того, события поддерживают запуск нескольких обратных вызовов, поэтому различные функции могут выполняться в зависимости от того, что имело доступ к объекту customers
.
Я бы рекомендовал использовать ориентированное на события решение, поскольку JavaScript - это ориентированный на события язык.
Ответ 2
Ответ довольно прямолинейный: поскольку событие может иметь неограниченные обработчики событий (которые не являются только обратными вызовами)... и обратный вызов - это всего лишь один обратный вызов, Я предлагаю вам перейти к методу программирования с событиями.
Ответ 3
Я бы пошел на callback-решение, когда создавал модуль. Это имеет одну меньшую зависимость: зависимость от вашего объекта события.
Если я загружаю сторонний плагин, скажем, тот, над которым вы сейчас работаете, я хотел бы иметь контроль над тем, что вызывается, когда функция выполняется и поднимает мое собственное событие, используя мой собственный выбор события автобус.
Если вы не создаете модуль, я думаю, что оба решения имеют обаяние.:)