Javascript - Передача и поиск функций обратного вызова - PullRequest
0 голосов
/ 07 марта 2011

Я пишу небольшой модуль, который будет иметь несколько различных аспектов, основанных на вызовах ajax.Я хочу, чтобы основные функции ajax, т.е. beforeSend, success, complete и т. Д. (Я использую jQuery), были настраиваемыми.

Каков наилучший способ сделать это?

У меня в настоящее время естьобъект параметров в модуле, который может быть расширен с помощью объекта параметров, переданного в функцию init.Здесь я передаю объект 'callbacks' с вложенными ojects для каждого отдельного типа действия, как в ...

        var insertCallbacks = {

        before : function() {

        },
        success : function() {

        },
        error : function() {

        },
        complete : function() {

        }
    };

    var updateCallbacks = {
        before : function() {

        },
        success : function() {

        },
        error : function() {

        },
        complete : function() {

        }
    };

    var callbacks =  {
        insert : addCallbacks,
        update : removeCallbacks    
    };

   MY_MODULE.init( {callbacks : callbacks} );

Проблема в том, что это становится немного грязным, проверяя существование каждогоиз этих методов в обратных вызовах ajax.

Может кто-нибудь предложить какой-нибудь совет относительно хорошего / лучшего шаблона для этого.

Ответы [ 2 ]

3 голосов
/ 07 марта 2011

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

MY_MODULE.trigger('updateComplete');

, а во всех частях вне модуля (а также внутри при необходимости) вы привязываете обработчики (теперь они являются обратными вызовами):

 MY_MODULE.bind('updateComplete', function() { 
    alert('update completed'); 
 } );

Настраиваемые события в jQuery открывают двери для сложного поведения , или Google в любой другой статье.Настраиваемые события помогут вам сохранить структурированный код и упростить тестирование

ADD ON: с обратными вызовами, которые вы всегда должны проверять, есть ли они, поэтому ваш код становится

if ( callbacks && callbacks.insert ) {
    callbacks.insert();
}

улучшая функциональность вашего модуля и улучшая его, однажды вы получите ситуацию, когда для одной и той же ситуации нужно передать несколько обратных вызовов (например, два объекта или компоненты пользовательского интерфейса заинтересованы в «обновлении» модуля) ... Это сделаеттвоя работа слишком сложна.С событиями у вас всегда есть одна строка кода

MY_MODULE.trigger('updateComplete');

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

1 голос
/ 07 марта 2011

Просто сделайте то же самое, что делает jQuery.Позвольте вашему модулю запускать события (через trigger()) и присоединять обработчики к этим событиям при необходимости (через bind()).Таким образом, вам не нужно проверять внутри вашего модуля, какие функции слушают (или вообще не прослушивают).

Поскольку ваш код не содержит что-либо , которое я мог бы использовать для примера, это своего родатрудно добавить код к этому ответу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...