我正试图找到一种方法来跟踪成功的ajax返回使用javascript而不是jquery或其他库。我要做的是在函数被触发时显示一个加载图形,并在返回所有结果时清除图形。我的函数分解输入并调用定义数量的ajax请求。
我读到没有直接的方法来做这件事。我正试图建立一个函数来计算成功的请求,但我遇到了一个我无法解决的逻辑障碍。我的基本提纲如下:
TIA
编辑更新解决方案。
解决方案是将ct创建为全局变量我的工作代码大纲是
var ct = 0;//declare outside of function as global
function ajaxcallback(...) {
...
if (success)
{
//output/do something
ct++; //increase global ct by 1
countajax (total);//call countajax
}
}//end function
function countajax (total)
{
if (ct == total)
{
//turn off loading graphic
}
}//end countajax
我认为countajax函数是不必要的,ct == total的比较可以在不调用countajax函数的情况下完成
实际上有一个非常简单的方法:
从每个ajax回调内部调用一个方法,并确保该函数只在所有ajax调用完成时才实际执行任何操作,如下所示:
(function() {
var ajax1_done = ajax2_done = ajax3_done = false;
function ajax1_callback() {
ajax1_done = true;
run_when_all_is_done();
}
function ajax2_callback() {
ajax2_done = true;
run_when_all_is_done();
}
function ajax3_callback() {
ajax3_done = true;
run_when_all_is_done();
}
function run_when_all_is_done() {
if(ajax1_done && ajax2_done && ajax3_done) {
//do stuff here
}
}
})();
这样做的一种方法是保留一个变量来跟踪您发出了多少请求,另一个变量来跟踪您收到了多少响应。然后,在启动所有ajax调用之后,启动一个轮询器(setInterval),检查响应计数变量是否与总请求变量匹配。
var totalRequests = 0,
successfulRequests = 0,
poller = null;
// psuedo code
totalRequests++;
ajax("http://server.com", function(resp){ successfulRequests++; } /** callback */);
totalRequests++;
ajax("http://server.com", function(resp){ successfulRequests++; } /** callback */);
totalRequests++;
ajax("http://server.com", function(resp){ successfulRequests++; } /** callback */);
// run poller after you've kicked off all your ajax requests
poller = window.setInterval(function(){
if(totalRequests === successfulRequests){
alert("all ajax finished");
window.clearInterval(poller);
poller = null;
}
},100);