如何通过使用jQuery解决所有延迟后运行函数的问题?

时间:2017-01-26 12:50:31

标签: jquery promise jquery-deferred .when

我不明白问题在哪里,我在这里读了几个问题,但没有类似的东西。 我不能使用函数来返回一个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是空的。 如何解决这个问题?

1 个答案:

答案 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;
&#13;
&#13;

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

&#13;
&#13;
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;
&#13;
&#13;

编辑 - 将回调更改为<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>,以便您可以看到,即使他们以随机顺序解析,您也会按照他们进入的顺序获得结果。(即when将永远是aruments[0],即使那个人可能没有先解决)