jQuery Deferred – 得到链式ajax调用的结果

以下问题 – 我必须多次调用ajax函数,当所有函数都完成后,将所有结果都放入数组中。 我想出了这个:

function doAjax(xx){ var xdata = {json: $.toJSON({name: xx}), delay: 1}; return $.ajax({ url:"/echo/json/", data:xdata, type:"POST" }); } var carr = [doAjax('a'),doAjax('b'),doAjax('c'),doAjax('d')] var result = []; $.when( carr ) .done(function(data){ console.log(data); $.each(data, function(ix,val){ console.log(val.name); }); }); 

在这里小提琴: http : //jsfiddle.net/Fkd9n/

一切似乎工作正常,“console.log(data)”用响应文本写出对象,但“console.log(val.name)”始终是“未定义”。 那么一旦完成所有调用,如何将所有结果联合在一个数组中?

谢谢!

如果您知道有多少Ajax-Calls,只需使用$ .when()

 $.when(doAjax('a'),doAjax('b'),doAjax('c'),doAjax('d')) .then(function(result_a,result_b,result_c,result_d) { console.log("Result from query a: " + result_a); console.log("Result from query b: " + result_b); console.log("Result from query c: " + result_c); console.log("Result from query d: " + result_d); }); 

如果您不知道有多少个ajax调用,您可以自己管理延迟对象。

 // altered version of doAjax() function doAjax(number,dObject) { var xdata = {json: $.toJSON({name: number}), delay: 1}; $.ajax({ url:"/echo/json/", data:xdata, type:"POST", success: function(data) { results.push(data); dObject.resolve(); } }); } // array that will contain all deferred objects var deferreds = []; // array that will contain all results var results = []; // make the ajax calls for (var i = 0; i < someNumber; i++) { var dObject = new $.Deferred(); deferreds.push(dObject); doAjax(i,dObject); } // check if all ajax calls have finished $.when.apply($, deferreds).done(function() { console.log(results); }); 

魔术带有函数apply(),它为一个函数的参数创建一个数组。

您可以使用pipefunction来处理结果数据。

 $.when.apply($, carr).pipe(function(){ console.log(arguments); return $.map(arguments, function(item){return item[0]}); }) .done(function(data){ console.log(data); $.each(data, function(ix,val){ console.log(val.name); }); });​ 

http://jsfiddle.net/Fkd9n/6/