我遇到了使ajax快速和功能正常的问题。这是伪/原型代码:
function blah1(arg1){//arg1 is an array, roughly 10 elements
var arr[];
$.each(arg1, function(i){
//blah code
$.ajax({
//blah options
async: true,
success: function(data){
arr[i] = data.someInt;
}//end success
});//end ajax
}//end each
return arr;
}//end function
基本上,我发送一个ajax并需要返回的数据进行进一步处理。
如果我将async设置为true,则该函数会立即返回空的'arr'数组,因此整个脚本失败。 但是如果我将async设置为false,那么它可以工作,但需要很长时间。
我已经看到了这个$.ajaxQueue();的事情,但坦率地说我根本不理解它,我不知道它是否会起作用。
所以问题是,首先,有没有什么方法可以同时异步发送所有的ajax请求,让函数等待并在所有ajax完成后返回arr []?如果没有,ajaxQueue会在我的情况下工作吗? (粗略的例子,请?)
答案 0 :(得分:5)
使用jQuery 1.5 deferred's我会选择这个:
function blah1(arr, callback){
$.when($.map(arr, function(val, i){
$.ajax({
//blah options
async: true
});
}).toArray()).then(function(resultsArr) {
callback(resultsArr);
});
}
问题是你在async ajax调用完成之前尝试返回函数中的数组。这实际上是不可能的,所以你需要将回调传递给blah。
你在这里做的是将你的对象数组映射到jqXHR对象(它们是延迟对象)。然后将该延迟对象数组传递给$.when
。
$.when
接受一个数组,然后允许您在整个数组从ajax调用完成加载后运行.then
函数。然后,您将resultsArr
作为参数传递给.then
函数。
如果您在ajax成功通话中操纵返回值,则无法在同一函数中使用$.ajax
和return
。
答案 1 :(得分:4)
你可以使Ajax调用同步,你似乎知道,个人我会考虑我的代码,所以ajax调用的成功方法,然后触发一个调用到另一个函数。
$.ajax({
//blah options
async: true,
success: function(data){
arr[i] = data.someInt;
myCall(arr[i]);
}//end success
});//end ajax