接下来的问题-我必须多次调用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调用,只需使用$ .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(),该函数为函数的参数组成一个数组。