повышение jquery deferred.then () после разрешения всех отложенных объектов - PullRequest
10 голосов
/ 07 апреля 2011

У меня есть две функции javascript, save() и saveAll(), настроенные следующим образом:

function save(data) {
    return $.post('/save', data);
}

function saveAll(callback) {
    var dataArray = [];
    $.each(dataArray, function() {
        save(this);
    });
    callback();
}

Мне интересно изменить saveAll(), чтобы он использовал объекты, отложенные в jquery, и поднялфункция callback после завершения всех операций save().Тем не менее, я не уверен в точном синтаксисе ... особенно в отношении $ .each () внутри $ .when ().это было бы что-то вроде этого?

function saveAll(callback) {
    var dataArray = [];
    $.when(
        $.each(dataArray, function() {
            return save(this);
        })
    ).then(callback);
}

Ответы [ 3 ]

21 голосов
/ 07 апреля 2011

Как указал Эли, $ .when () принимает список аргументов через запятую, а не массив. использование Function.apply() для передачи в массиве похоже на дело.

function saveAll(callback) {
    var dataArray = [], deferreds = [];
    $.each(dataArray, function() {
        deferreds.push( save() );
    });

    $.when.apply(window, deferreds).then(callback);
}
1 голос
/ 07 апреля 2011

Я думаю, что проблема в том, что $.each возвращает ваш dataArray, а не список Deferred объектов, которые вы хотите передать $.when.

1 голос
/ 07 апреля 2011

Вы должны быть в состоянии передать разделенный запятыми список отложенных объектов в $.when, и .then выполнится, как только они все разрешатся.

http://api.jquery.com/jQuery.when/

...