Javascript 对不同数量的ajax请求使用jquery延迟
当ajax请求数量可变时,如何使用延迟调用它们 我猜:Javascript 对不同数量的ajax请求使用jquery延迟,javascript,jquery,jquery-deferred,Javascript,Jquery,Jquery Deferred,当ajax请求数量可变时,如何使用延迟调用它们 我猜: //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 //obvious
//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++;
}
});
}
//qty\u of\u get=3;
函数getHTML(productID,数量){
var dfd=$.Deferred(),
i=0,
c=0;
//这是一个有魔力的地方
//做多篇ajax文章
//很明显,我在这方面做得太过火了。。。
(i关闭时,需要从.pipe
回调返回承诺对象。
参见felix的回答,下一个样本除了缺少返回之外还有其他问题
dfd.pipe(function(){
return $.get("queries/html/" + product_id + i + ".php");
});
此外,我认为它实际上还没有在任何地方编写,但在最新版本的核心中,.pipe
是这样实现的:
promise.pipe = promise.then
因此,您可以将dfd.pipe
替换为dfd.then
参考:
adeneo提到的另一种选择是使用$。当
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]);
}
});
}
函数getHTML(productID,数量){
var-dfdArr=[];
而(i如果要按顺序执行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();
如果您只是将ajax请求自动返回的延迟对象粘贴到一个数组中,并在使用apply()时将数组放入$,你会成功的!仅供参考,这是一个相对较新的开发。根据,然后
应该返回一个承诺,但jQuery中最初的承诺实现没有这样做;相反,他们创建了一个不同的管道
方法。为了更符合规范(他们仍然没有完全遵守),他们改变了然后
的行为,所以他们就把管道
化名为然后
。我相信管道
从1.8开始就被弃用了,应该避免。@JosephSilber是的,折旧通知根本没有发到API站点,因为API站点在1.9发布之前根本没有更新1.8发布了。现在它当然被记录为已折旧。谢谢。你能解释一下$.when.apply(null,dfdArr)是如何应用的吗.done
正在工作。到底做了什么?另外,像这样将各种get
放入数组是否会使它们保持一个顺序链?产品id+1
被追加,然后产品id+2
,依此类推?或者它们是否按最快返回的顺序推入数组?while循环将保持执行不等待异步请求的结果,对吗?再次感谢。当
方法接受n个参数时,使用。应用
,它将延迟对象数组作为参数应用于。当
方法使它更容易应用动态数量的参数。此方法和您的方法都不适用od保证请求完成的顺序,但是它确实保证每个请求都会用正确的i
值触发,并且如果它们都成功,那么最后的.done
将在它们都成功时触发。两者之间的区别是。然后,way只会给出la的结果st one已发送,而.when方式将允许您通过查看返回的参数来访问所有请求中的所有返回数据。例如,您可以对(参数中的参数){console.log(参数[0])执行For
以从0
到n
的顺序获取每个请求返回的文本。谢谢。我在这一页中读到的问题是,每个匿名函数内的变量I绑定到函数外的同一个变量。以及许多其他类似的解释。但我不明白I
是否绑定不上o匿名函数的内部,为什么不在每次通过循环时再次传入它。当然,它存在于外部,但它的值不是不断递增并传入的。这是不是说,在您第一次创建匿名函数时,该值会以某种方式永久设置,以便javascript始终读取console.log(1)
还有几个问题:你说“你必须从回调中返回承诺”。promise的回调函数就这样做了。你所做的是像promise.then($.get(“querys/1.php”)。然后($.get(“querys/2.php”)…
?为什么把resolve()
放在done()之后
?jquery API说“当延迟被解析时,将调用Deferred.then或Deferred.done添加的所有doneCallbacks。”再次感谢所有帮助!在循环的每次迭代中,都会创建一个新的匿名函数。您永远不会调用同一个函数两次。但是,您可以创建一个函数函数foo(promise,i){return promise.then(function(){…});}
并调用此函数而不是匿名函数:promise=foo(promise,i)
。这是一样的。关键是调用一个函数来创建一个新的作用域。关于第二个问题,这与调用promise.then(function(){return$.get(…);})。然后(…)。然后(…)。然后(…)
。然后
总是返回一个新的承诺。如果我不调用.resolve
,将永远不会调用任何回调。我们希望第一个承诺对象调用它的。然后回调,以便它开始发出这些Ajax请求。在延迟对象得到解决之前,它不会这样做。请注意,.done
callback被添加到链中的最后一个promise对象中,而不是延迟对象本身。我也可以在延迟对象创建后立即调用.resolve
,这不会产生任何影响。我只是说,在页面上,它在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`
});