当所有延迟对象都被解决后,触发jQuery Deferred.then()方法。

10

我有两个JavaScript函数,save()saveAll(),如下所示:

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

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

我有兴趣修改saveAll(),让它利用jQuery延迟对象,并在所有save()操作完成后调用callback函数。然而,我不确定具体的语法...特别是与$.when()内部的$.each()相关的部分。会像这样吗?

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

21

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

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

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

2
这太棒了,我正需要这个。我很惊讶jQuery本身不允许使用延迟对象数组。 - Gary Green
11
请注意,关于$.when的一个鲜为人知的事实是,如果其中任何一个参数被拒绝/失败,它将立即解决,而不会等待其余参数! 这是真的 :) 如果你问我,这是出乎意料的。 我编写了一个$.whenAll(),它始终等待所有参数解决,无论成功或失败状态如何:http://jsfiddle.net/InfinitiesLoop/yQsYK/ - InfinitiesLoop

1

1
我认为问题在于$.each返回了你的dataArray,而不是像你想要提供给$.whenDeferred对象列表。

你说得对,$.each() 的返回值不是我想要的。谢谢。 - Omer Bokhari

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接