0

Javascript: обработчик получения данных

Posted февраля 19, 2010 in Javascript and tagged , , by SpiRi7

В процессе работы мне пришлось столкнуться с интерестным плагином для jQuery. Плагин представляет собой календарь позволяющих добавлять события для определенных дат. Функционал реализуемый плагином, в какой мере, подобен google calendar.
Но в этой заметке речь пойдет не о плагине, а о способе получения событий.
Итак необходимо реализовать интерфейс установки массива событий как в виде масива данных, так и в виде URL на серверный обработчик данных. Дополнительным требованием будет возможность поддерживать возможность установки нескольких серверных обработчиков.

Итак первоначально определим обработчик определяющий тип передаваемых данных

var events = [];
var eventSources = options.eventSources || [];
if (options.events) eventSources.push(options.events);

В этом участке кода – options массив исходных настроек.

Следующей задачей является определение обработчика при вызове которого производится анализ/получение данных и их последующая обработка (преобразование, отрисовка и т. п.)
Итак для вызова этих действий будем использовать одну функцию
fetchEvents(renderEvents);
где renderEvents это callback функция обработчик полученных данных.

//
// Fetch from ALL sources. Clear 'events' array and populate
//
function fetchEvents(callback) {
    events = [];
    if (eventSources.length > 0) {
      var queued = eventSources.length;
      // This is a function, code execute only when we call this function
      // Not now
      var sourceDone = function() {
          if (--queued == 0) {
             //  stack of call ++
             popLoading();
             if (callback) {
                 callback(events);
             }
          }
       };
       // Stack of call --
       pushLoading();
       for (var i = 0; i < eventSources.length; i++) {
            fetchEventSource(eventSources[i], sourceDone);
       }
    }
}
 
//
// methods for reporting loading state
//
var loadingLevel = 0;
 
function pushLoading() {
    if (!loadingLevel++ && options.loading) {
        options.loading(true);
    }
}
 
function popLoading() {
    if (! --loadingLevel && options.loading) {
        options.loading(false);
    }
}

Этот кусок кода проверяет на наличие источников событий, если источников более 0, создает функцию обработчик, увеличивает счетчик запусков получения данных. И для каждого источника вызывает функцию получения данных. Обратите внимание что в функцию fetchEventSource кроме текущего источника мы передаем, так же callback функцию.
Итак функция обработчик получения данных

//
// Fetch from a particular source. Append to the 'events' array
//
 
function fetchEventSource(src, callback) {
    // This is callback function for ajax call
    var reportEvents = function(response) {
         for (var i = 0; i < responseEvents.length; i++) {
                // Translate recived events list to our need format
         }
         events = events.concat(responseEvents);
         if (callback) {
            callback(responseEvents);
         }
     };
     if (typeof src == 'string') {
           // Type of source is url 
           var params = {}; // Params for ajax call
            $.getJSON(src, params, reportEvents);
     } else if ($.isFunction(src)) {
           // Tupe of source is function
           src(start, end, reportEvents);
     } else {
          reportEvents(src);
     }
}

Алгоритм работы функции очень простой. Мы определили функцию обработчик вызова данных — reportEvents. Далее, в зависимости от типа исходных данных (url, функция, масив) производим необходимые действия (отправка ajax запроса, прямой вызов обработчика). В дальнейшем функция обработчик вызывает первоначальный указанный callback
Приблизительная схема алгоритма

Похожие посты:

    None Found

Leave a Reply