如何 运行 仅在使用 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
,即使那个可能没有先解决)
我不明白问题出在哪里,我在这里阅读了几个问题,但没有类似的问题。 我不能使用函数来 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
,即使那个可能没有先解决)