在我的项目中,数据分布在表组中。为了读取数据,我需要为这些组(1 ... groupCount)中的每个组Async call
。
在成功读取每个组中存在的所有数据后,我需要调用另一个函数。这样做的最佳方式是什么?
function getData() {
for(var gc = 1; gc < groupCount; gc++)
readDataFromAsync(gc);
}
答案 0 :(得分:2)
假设readDataFromAsync
返回一个jQuery延迟对象
使用jQuery.when()
并在完成所有操作后传递回调。
function getData() {
var promises = [];
for (var gc = 1; gc < groupCount; gc++) {
promises.push(readDataFromAsync(gc));
}
$.when.apply(undefined, promises).done(function(/*...*/) {
// your code
});
}
答案 1 :(得分:0)
首先,多次调用AJAX是一种不好的做法,比如在循环内部。 如果您可以组合所有呼叫并一次发送所有请求,并一次收回所有响应,那么这将是最好的方法。为此,您还需要更新服务器端代码。
但总是不可能,并且根据情况你需要像这样打电话。
以下是一些替代方案。 使用async异步调用如下
jQuery.ajax({
url: '.....',
success: function (result) {
//.....
},
async: false
});
但是它会很慢,因为1比1的呼叫是存在的,而不是一个好的做法。
因此,您可以将ajaxResponse计为成功或不成功响应的变量,并在ajaxResponse达到其上限时调用最终方法,如下所示。
var ajaxResponse = 0;
function getData() {
ajaxResponse= 0;
for(var gc = 1; gc < groupCount; gc++)
readDataFromAsync(gc);
}
function readDataFromAsync(gc) {
$.ajax(...).success() {
//Your current code
ajaxResponse++;
if(ajaxResponse>=groupCount){
finalCall();
}
}
}
但是上述方法也存在问题。处理ajaxResponse计数器很困难,并且可能在ajax调用上发生错误。
您还可以尝试setInterval和clearInterval,如果在成功方法中放置一个,但是它也会很昂贵。 最后一个但最好的是@Li Yin Kong提供的方法如下。
function getData() {
var promises = [];
for (var gc = 1; gc < groupCount; gc++) {
promises.push(readDataFromAsync(gc));
}
$.when.apply(undefined, promises).done(function(/*...*/) {
// your code
});
}