jQuery。当使用可变数量的参数进行故障排除时
我在使用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有任意数量的参数有关,因为我在网上看到的所有例子都给它一个预定义的参数列表。
我不确定使用apply是否是正确的想法,但无论哪种方式,它都不能正常工作,并且行为异常(依赖于浏览器)。
任何帮助将不胜感激。
请让我知道是否需要更多信息。
我正在使用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
});
});
除了Andy Corman的回答(我还无法回复帖子,我认为...),如果您只有一个请求,则回复信息将作为参数直接传递给defer.done函数; 所以你需要提供一个如果这种情况下:
// Array of requests
var requests = Array();
requests.push($.get('responsePage.php?data=foo'));
var defer = $.when.apply($, requests);
defer.done(function(){
// This is executed only after every ajax request has been completed
if (requests.length == 1)
// "arguments" will be the array of response information for the request
else
$.each(arguments, function(index, responseData){
// "responseData" will contain an array of response information for each specific request
});
});
我想我现在已经解决了 - 问题在于处理返回的参数。 .done只传递了三个参数 - 响应文本,状态和jqXHR对象。 我期待它能通过每个查询产生的jqXHR对象。
我已经通过将每个查询的回调代码移动到一个单独的函数来解决它(例如loadData中的ajax调用现在指定一个回调函数,该函数执行'.loadData(...)'调用),并且唯一完成的通过.done调用的是inst.draw()。 这似乎工作正常:个别回调的每个执行之前.done()。
我不确定这究竟是如何工作的,但它似乎在做这项工作。
链接地址: http://www.djcxy.com/p/55779.html上一篇: jQuery .when troubleshooting with variable number of arguments
下一篇: "Cross origin requests are only supported for HTTP." error when loading a local file