如何仅在使用jQuery解决所有延迟问题后运行函数?

如何仅在使用jQuery解决所有延迟问题后运行函数?,jquery,promise,jquery-deferred,.when,Jquery,Promise,Jquery Deferred,.when,我不明白问题出在哪里,我在这里读过几个问题,但没有类似的问题。 我不能使用函数返回承诺,我只需要将所有承诺放在一个数组中,并将其传递给“$.when”函数 var pr = []; var count = 3; while(count--){ setTimeout(function(){ var def = $.Deferred(); pr.push(def.promise()); console.log('COUNT: '+count); def

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

您只是在延迟运行后将其添加到数组中。关键是你想让他们先在阵列中,然后当他们全部解决时,执行一些功能

var defA=$.Deferred();
var pr=[defA.promise()];
var计数=3;
var defB=$.Deferred();
pr.push(defB.promise());
var defC=$.Deferred();
pr.push(defC.promise());
setTimeout(函数(){
console.log('COUNT:'+COUNT--);defB.resolve(COUNT);
},Math.random()*2000);
setTimeout(函数(){
console.log('COUNT:'+COUNT--);defC.resolve(COUNT);
决议(11011);
},Math.random()*2000);
$.when.apply($,pr).done(函数d){
日志(“日志:”,d);
});

您只是在延迟运行之后才将其添加到数组中。关键是你想让他们先在阵列中,然后当他们全部解决时,执行一些功能

var defA=$.Deferred();
var pr=[defA.promise()];
var计数=3;
var defB=$.Deferred();
pr.push(defB.promise());
var defC=$.Deferred();
pr.push(defC.promise());
setTimeout(函数(){
console.log('COUNT:'+COUNT--);defB.resolve(COUNT);
},Math.random()*2000);
setTimeout(函数(){
console.log('COUNT:'+COUNT--);defC.resolve(COUNT);
决议(11011);
},Math.random()*2000);
$.when.apply($,pr).done(函数d){
日志(“日志:”,d);
});

如果我在一段时间内/为/每个人创建$延迟,我该怎么做?@Donovant问正确的问题是一个好的开始。如果你的问题真的是
b
,不要问
a
。但是,无论它们是在一条直线上还是在一个环路上,都不应该有什么区别。在异步工作之外创建延迟。@Donovant我假设您不打算计数--
两次?@Donovant answer updated。循环稍微复杂一点,但仅此而已。如果我创建$。延迟一段时间/for/each,我该怎么做?@Donovant问正确的问题是一个好的开始。如果你的问题真的是
b
,不要问
a
。但是,无论它们是在一条直线上还是在一个环路上,都不应该有什么区别。在异步工作之外创建延迟。@Donovant我假设您不打算计数--
两次?@Donovant answer updated。循环稍微复杂一点,但仅此而已。您需要立即创建延迟(以便可以将它们传递到
$。当
时),而不是将来某个时候!您需要立即创建延迟(以便可以在时将它们传递到$),而不是将来的某个时候!