我不明白问题在哪里,我在这里读了几个问题,但没有类似的东西。 我不能使用函数来返回一个promise,我只需要将所有的promises放在一个数组中并将它传递给“$ .when”函数。
var pr = [];
var count = 3;
while(count--){
setTimeout(function(){
var def = $.Deferred();
pr.push(def.promise());
console.log('COUNT: '+count); def.resolve(count);
}, Math.random()*2000);
}
$.when.apply($, pr).done(function(d){
console.log("LOG:",d);
});
显然不起作用,因为在那个时候pr是空的。 如何解决这个问题?
答案 0 :(得分:2)
您只是在他们运行后才将延迟添加到数组中。关键是你需要预先在阵列中,然后当他们全部解决执行某些功能时。
var defA = $.Deferred();
var pr = [defA.promise()];
var count = 3;
var defB = $.Deferred();
pr.push(defB.promise());
var defC = $.Deferred();
pr.push(defC.promise());
setTimeout(function(){
console.log('COUNT: '+count--); defB.resolve(count);
}, Math.random()*2000);
setTimeout(function(){
console.log('COUNT: '+count--); defC.resolve(count);
defA.resolve(11011);
}, Math.random()*2000);
$.when.apply($, pr).done(function(d){
console.log("LOG:",d);
});

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
&#13;
对于您的更新,您还需要使用闭包,因为count
将在异步工作完成时发生更改(即,没有它,您将被记录{{ 1}}三次)。此闭包还具有将count: 0
保留在每次迭代的局部范围内的巧妙副作用。更多信息在此Q / A中:
JavaScript closure inside loops – simple practical example
def
&#13;
var pr = [];
var count = 3;
while(count--){
(function(x){
var def = $.Deferred();
pr.push(def.promise());
setTimeout(function(){
console.log('COUNT: '+ x);
def.resolve(x);
}, Math.random()*2000);
})(count);
}
$.when.apply($, pr).done(function(){
console.log("LOG:",arguments);
});
&#13;
编辑 - 将回调更改为<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
,以便您可以看到,即使他们以随机顺序解析,您也会按照他们进入的顺序获得结果。(即when
将永远是aruments[0]
,即使那个人可能没有先解决)