我有一个问题,使用jQuery.when()等待多个ajax请求完成之前调用另一个函数。
每个ajax请求将获得JSON数据,看起来像这样:
function loadData(arg){ var ajaxCall = $.ajax( URL // depends on arg ) .error( .... ); return ajaxCall; }
当请求被调用时,返回值(ajaxCall)被添加到名为ajaxRequests的列表。
ajaxRequests = []; ajaxREquests.push(loadData(arg))
当所有的请求已经作出,我试图传递ajaxRequests到$ .when为了等待所有的请求完成。
var defer = $.when.apply($,ajaxRequests); defer.done(function(args){ for (var i=0; i<args.length; i++){ inst.loadData($.parseJSON(args[i].responseText)); } inst.draw(); });
inst是一个基于JSON数据加载和绘制图形的对象。
问题是,它似乎并没有真正等待请求完成 – args [i]是一个对象,但responseText是未定义的,当代码运行。如果我保存args [i]并稍后从控制台访问它,它的工作原理。
我怀疑这个问题是关于使用.when与任意数量的参数,因为所有的例子,我看到在网络上给它一个预定义的参数列表。
我不知道如果使用应用是正确的想法或没有,但任何一种方式,它不能正常工作和行为不规律(浏览器依赖)。
任何帮助将不胜感激。
如果需要更多信息,请与我们联系。
我使用jQuery 1.5
解决方法
虽然亚历克斯确实提供了一个解决他的问题,我发现以下它有点困难。我有一个类似于他解决的问题,我想为任何需要处理可变数量的ajax请求的人分享我的解决方案。
// Array of requests var requests = Array(); requests.push($.get('responsePage.PHP?data=foo')); requests.push($.get('responsePage.PHP?data=bar')); var defer = $.when.apply($,requests); defer.done(function(){ // This is executed only after every ajax request has been completed $.each(arguments,function(index,responseData){ // "responseData" will contain an array of response information for each specific request }); });