Повышение jquery отложен. then() после того, как все отложенные объекты были разрешены

У меня есть две функции 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);
}

Ответ 1

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

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

    $.when.apply(window, deferreds).then(callback);
}

Ответ 2

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

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

Ответ 3

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