Правильное написание асинхронного приложения

Задача:


Зарегистрировать выполнение всех запросов, объединенных общей целью. Выполнить код по завершению всех запросов.

У меня мало опыта в решении подобных задач, коллеги, подскажите, я правильной дорогой иду?
ajax_request и another_ajax_request могут вызываться в произвольных частях кода, многоэтажка из коллбеков строго не рекомендуется.

Мой код:



http://jsfiddle.net/alexbaumgertner/72dcK/

ApplicationDeferreds = {

    deferreds: [],

    done: function(callback) {
        jQuery.when.apply(null, this.deferreds).done(callback);
    },
    register: function(deferred) {
        var self = this;

        // delete resolved
        jQuery.each(this.deferreds, function(index, value) {
            if (value.state() == 'resolved') {
                self.deferreds.splice(self.deferreds.indexOf(value), 1);
            }
        });

        this.deferreds.push(deferred);
    }
};

function ajax_request() {
    ApplicationDeferreds.register(jQuery.get('/'));
}
function another_ajax_request() {
    ApplicationDeferreds.register(jQuery.get('/'));
}

ajax_request();
another_ajax_request();

ApplicationDeferreds.done(function() {
    // do someone
    $('#result').html('done!');
});
8 февраля в 22:24
3
alexbaum 9,1

отсортировано по дате по оценке
ответы (3)

0
taliban #
Я бы сделал так:
ajax_request(callback1);
ajax_request(callback2);
Хотя это очень зависит от задач, есть такие в которых нужна последовательность.
+2
deadkrolik #
Может вот это api.jquery.com/category/callbacks-object/ поможет.
Да, по-моему выше я как раз пытался написать велосипед api.jquery.com/jQuery.Callbacks/ :) alexbaum, 9 февраля в 13:45
0
Litiy #
Возможно стоит воспользоваться backbone.js/knockout.js. У них очень неплохо продумана работа с событиями и асинхронными запросами. Код становится понятнее и красивее. Если вы без предубеждений к фреймворкам (backbone отлично работает с другими библиотеками и никак с ними не конфликтует, весит 4 килобайта и не нагружает страницу, по опыту — супер).

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.