当我有可变数量的Ajax请求的,我怎么能叫他们用deferreds?
我猜:
//qty_of_gets = 3;
function getHTML(productID, qty_of_gets){
var dfd = $.Deferred(),
i = 0,
c = 0;
//this is where there could be some magic to
//do multiple ajax posts
//obviously I'm out of my depth here...
while (i <= qty_of_gets){
dfd.pipe(function(){
$.get("queries/html/" + product_id + i + ".php");
});
i++
}
dfd.done(function(){
while (c <= qty_of_gets){
$('myDiv').append(c);
c++;
}
});
}
如果你想执行Ajax调用顺序,你必须从回调返回的承诺,还附上了新的回调到最后承诺对象:
var dfd = $.Deferred(),
promise = dfd.promise(),
i = 0,
c = 0;
while (i <= qty_of_gets) {
// needs an IIFE
(function(i)
promise = promise.then(function(){
return $.get("queries/html/" + product_id + i + ".php");
});
}(i++));
}
promise.done(function(){
while (c <= qty_of_gets){
$('myDiv').append(c);
c++;
}
});
// resolve deferred
dfd.resolve();
在jQuery 1.8中,你应该使用.then
,而不是.pipe
。
另一个问题是(在你的例子至少),当时的回调执行, i
不会有你所期望的价值。 您可以使用立即调用的函数表达式捕捉到的当前值i
。 见里面循环的JavaScript关闭-简单实用的例子以获得更多信息。
这里是获得的结果不干净的解决方案。 我想你可以做的是把结果加入数组中选择最佳并访问数组中的.done
回调。 即:
var results = [];
while (i <= qty_of_gets) {
// needs an IIFE
(function(i)
promise = promise.then(function(){
return $.get("queries/html/" + product_id + i + ".php")
.then(function(result) {
results[i] = result;
});
});
}(i++));
}
promise.done(function(){
// do something with `results`
});
关闭,你需要从返回一个承诺对象.pipe
回调。
见Felix的答案,接下来的样品已经不仅仅是恢复丢失的其他问题。
dfd.pipe(function(){
return $.get("queries/html/" + product_id + i + ".php");
});
另外,我不认为它实际上是书面的任何地方还,但 .pipe
是在最新版本的内核中实现这样的:
promise.pipe = promise.then
因此,你可以应更换dfd.pipe
与dfd.then
参考: http://api.jquery.com/deferred.pipe/
作为adeneo提到的另一种方法是使用$.when
function getHTML(productID, qty_of_gets) {
var dfdArr = [];
while (i <= qty_of_gets) {
dfdArr.push($.get("queries/html/" + product_id + i + ".php"));
i++
}
$.when.apply(null, dfdArr).done(function () {
for (response in arguments) {
$('#myDiv').append(response[0]);
}
});
}