我有很多情况需要累积多个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();
这是一个很好的早期返回值(例如,当根本没有动画开始时)。
答案 0 :(得分:2)
为什么这不按预期工作?
因为apply
接受数组作为其第二个参数,但您传递的是Promise
。
由于$(".box").promise()
返回一个在所有排队操作完成后解析的promise,而不是数组,因此不能将其与apply
一起使用。
您需要做的就是直接使用结果:
makePromises().then(/*...*/);
(A.Wolff的代码:
$.when(makePromises()).then(/*...*/);
...也会有效,但除非你还有其他承诺,否则你也需要将它与之结合起来。)