如何 运行 仅在使用 jQuery 解析所有延迟后的函数?

How run a function only after all deferred are resolved by using jQuery?

我不明白问题出在哪里,我在这里阅读了几个问题,但没有类似的问题。 我不能使用函数来 return 承诺,我只需要将所有承诺放在一个数组中并将其传递给“$.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 是空的。 如何解决?

您只是在 运行 之后才将 deferred 添加到数组中。关键是你希望它们在前面的数组中,然后当它们全部 resolve 执行一些功能时。

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>

对于您的更新,您还需要使用闭包,因为 count 将在异步工作完成时发生变化(即,如果没有它,您将被记录 count: 0 三遍)。这个闭包还有一个巧妙的副作用,即每次迭代都将 def 保留在局部范围内。 Q/A 中的更多信息: JavaScript closure inside loops – simple practical example

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);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

编辑 - 将回调更改为 when 这样您就可以看到,即使它们以随机顺序解析,您也会按照它们进入的顺序返回结果。(即 aruments[0] 将永远是 2,即使那个可能没有先解决)