结合jQuery承诺的最简单方法是什么?

时间:2014-06-18 16:12:29

标签: jquery promise

我有很多情况需要累积多个jQuery承诺(动画或Ajax或其他"),但我尝试的简单测试并没有等待所有这些完成(或对于其中任何一个):

JSFiddle:http://jsfiddle.net/TrueBlueAussie/j7EL4/2/

function makePromises() {
    $('#box1').animate({
        left: 300
    }, 4000);
    $('#box2').animate({
        left: 300
    }, 1000);
    $('#box3').animate({
        left: 300
    }, 2000);
    $('#box4').animate({
        left: 300
    }, 3000);
    return $('.box').promise();
};

$.when.apply($, makePromises()).then(function(){
    $('.box').addClass("done");
});

最糟糕的情况是,在将所有方框设置为灰色之前,我原本期望它等待第一场比赛。

为什么这不按预期工作?

更新

现在我知道jQuery正确地组合了多个元素的promises,我注意到你也可以使用一个空的jQuery对象的承诺来提供空的承诺

e.g。

return $().promise();

这是一个很好的早期返回值(例如,当根本没有动画开始时)。

1 个答案:

答案 0 :(得分:2)

  

为什么这不按预期工作?

因为apply接受数组作为其第二个参数,但您传递的是Promise

由于$(".box").promise()返回一个在所有排队操作完成后解析的promise,而不是数组,因此不能将其与apply一起使用。

您需要做的就是直接使用结果:

makePromises().then(/*...*/);

Updated Fiddle

(A.Wolff的代码:

$.when(makePromises()).then(/*...*/);

...也会有效,但除非你还有其他承诺,否则你也需要将它与之结合起来。)