对可变数量的ajax请求使用jquery deferreds

当我有一个可变数量的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 //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调用,则必须从回调中返回promise,并将新回调附加到最后一个promise对象:

 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开始,你应该使用.pipe而不是.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回调中返回一个promise对象。
请参阅felix的答案,下一个示例还有其他问题,而不仅仅是返回丢失。

 dfd.pipe(function(){ return $.get("queries/html/" + product_id + i + ".php"); }); 

另外,我认为它实际上并没有写在任何地方,但是 .pipe在最新版本的核心中实现如下:

 promise.pipe = promise.then 

因此,你可以dfd.then替换dfd.then
参考: http : //api.jquery.com/deferred.pipe/

adeneo提到的替代方案是使用$.when .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]); } }); }