我有一个问题,使用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
- });
- });