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

Ome*_*ari 10 ajax jquery jquery-deferred

我有两个javascript函数,save()saveAll()设置如下:

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

function saveAll(callback) {
    var dataArray = [];
    $.each(dataArray, function() {
        save(this);
    });
    callback();
}
Run Code Online (Sandbox Code Playgroud)

我有兴趣修改saveAll()它以利用jquery延迟对象,并在callback所有save()操作完成后引发该函数.但是,我不确定确切的语法...特别是与$ .when()内部的$ .each()有关.会是这样的吗?

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

Ome*_*ari 21

正如Eli指出的那样,$ .when()接受逗号分隔的参数列表而不是数组.使用Function.apply()传入数组似乎可以做到这一点.

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

    $.when.apply(window, deferreds).then(callback);
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,因为关于$ .when的一个鲜为人知的事实是,如果任何一个参数被拒绝/失败,它将立即解决,而不等待其余的!这是真的:)而且出乎意料,如果你问我.我写了一个$ .whenAll(),总是等待所有要解析的参数,无论成功/失败状态如何:http://jsfiddle.net/InfinitiesLoop/yQsYK/ (10认同)
  • 这太棒了,正在寻找这个.我很惊讶jQuery本身不允许一系列延迟对象. (2认同)