Подтвердить что ты не робот

События 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); 
        });
    }
};

В обоих случаях потребитель объекта клиента не знает своих внутренних разработок. Имеет ли один способ преимущество над другим?

4b9b3361

Ответ 1

Событие - это обратные вызовы, но разница заключается в том, когда и где они связаны. В первом случае вам нужно иметь ссылку на обратный вызов в момент вызова get, кроме того, он ограничивается одним обратным вызовом.

Во втором сценарии (предполагая, что вы запускаете событие с этим псевдокодом) вы могли бы связать обратный вызов вне области действия, где вызывается get, что обеспечивает более сильную инкапсуляцию данных. Кроме того, события поддерживают запуск нескольких обратных вызовов, поэтому различные функции могут выполняться в зависимости от того, что имело доступ к объекту customers.

Я бы рекомендовал использовать ориентированное на события решение, поскольку JavaScript - это ориентированный на события язык.

Ответ 2

Ответ довольно прямолинейный: поскольку событие может иметь неограниченные обработчики событий (которые не являются только обратными вызовами)... и обратный вызов - это всего лишь один обратный вызов, Я предлагаю вам перейти к методу программирования с событиями.

Ответ 3

Я бы пошел на callback-решение, когда создавал модуль. Это имеет одну меньшую зависимость: зависимость от вашего объекта события.

Если я загружаю сторонний плагин, скажем, тот, над которым вы сейчас работаете, я хотел бы иметь контроль над тем, что вызывается, когда функция выполняется и поднимает мое собственное событие, используя мой собственный выбор события автобус.

Если вы не создаете модуль, я думаю, что оба решения имеют обаяние.:)