一旦解决了所有延迟对象,就提高jquerydeferred.then()

时间:2011-04-06 21:27:31

标签: jquery ajax jquery-deferred

我有两个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()函数。但是,我不确定确切的语法...特别是与$ .when()内部的$ .each()有关。它会是这样的吗?

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

3 个答案:

答案 0 :(得分:21)

正如Eli指出的那样,$ .when()接受以逗号分隔的参数列表而不是数组。使用Function.apply()传入数组似乎可以解决问题。

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

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

答案 1 :(得分:1)

您应该能够将逗号分隔的延迟对象列表传递给$.when.then将在所有已解决后执行。

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

答案 2 :(得分:1)

我认为问题是$.each正在返回您的dataArray,而不是Deferred个对象的列表,就像您想要提供给$.when一样。