Слабая связь пользовательских колбэков в jQuery - PullRequest
1 голос
/ 07 ноября 2011

Мне было интересно, существует ли шаблон проектирования / каркас, который допускает слабую связь обратных вызовов в jQuery.

По сути, у меня есть вызов ajax, который возвращает настройки, которые потребуются в функциях обратного вызова. У меня есть ряд функций, которые я хотел бы запустить после завершения вызова ajax, но хотел бы избежать выполнения чего-то вроде:

$.getJSON('/webservice/config', function(data) {
    functionA();
    functionB();
}

Я бы хотел, чтобы он был слабосвязанным. У кого-нибудь есть идеи о том, как это возможно?

Спасибо, Gearoid.

РЕШЕНИЕ

Вот что я использовал в конце:

function initConfig(callbacks) {

    $.getJSON('/webservices/config', function(data) {       

        $.each(data.config, function(key, value) { 
          config[data.config[key].paramName] = data.config[key].paramValue; 
        });

    }).done(function() {
        //callbacks
        callbacks.forEach(function(callback) {
           if (eval('typeof ' + callback) == 'function') {
            window[callback]();
        });
    });
}

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

initConfig('setLocationData', 'setUserData');

Ответы [ 3 ]

1 голос
/ 07 ноября 2011

Объект jqXHR, который является возвращаемым значением всех запросов AJAX, поддерживает метод done, который позволяет связывать произвольные функции, которые выполняются по завершении запроса;

jQuery.getJSON('/foo.json').done(function () {
 // One success handler
}).done(function () {
 // Another success handler
});

Это потому, что модуль AJAX был переписан в jQuery 1.5 для использования Отложенный интерфейс , который гарантирует выполнение обработчиков, которые связаны либо до, либо после срабатывания обратного вызова.

Редактировать: объяснить мой комментарий

function initConfig() {
    return $.getJSON('/webservices/config', function(data) {       
        $.each(data.config, function(key, value) { 
          config[data.config[key].paramName] = data.config[key].paramValue; 
        });
    });
}

initConfig().done(setLocationData, setUserData);
1 голос
/ 07 ноября 2011

Функция $ .ajax может принимать несколько успешных обратных вызовов. Цитата от http://api.jquery.com/jQuery.ajax/:

Начиная с jQuery 1.5, настройка успеха может принимать массив функций. Каждая функция будет вызываться по очереди.

Краткий пример: (см. http://jsfiddle.net/JhTDW/)

$.ajax({
  url: '/echo/json/',
  success: [
    function(data) {
      document.write('First callback: ' + data + '<br/>');
    },
    function(data) {
      document.write('Second callback: ' + data + '<br/>');
    }
  ]
});
0 голосов
/ 07 ноября 2011

Не уверен, насколько слабо он должен быть связан, но в случае успешного обратного вызова вы всегда можете отправить свой объект data другой функции. Но я не уверен, как это будет разъединять вещи. В одном случае вы звоните functionA() и functionB() изнутри успешного обратного вызова; в другом случае вы отправляете данные на utilityFunction(), который работает functionA() и functionB().

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

Суть вопроса заключается в следующем: вы получаете data назад, и, вероятно, вы хотите воздействовать на эти данные или, по крайней мере, запустить логику в зависимости от ответа. Он настолько же отделен, насколько и получится, и оттуда зависит только то, как вы хотите его структурировать.

...