Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript—跟踪成功的ajax请求/返回_Javascript_Ajax - Fatal编程技术网

javascript—跟踪成功的ajax请求/返回

javascript—跟踪成功的ajax请求/返回,javascript,ajax,Javascript,Ajax,我试图找到一种方法来跟踪成功的ajax返回,只使用javascript,而不是jquery或其他LIB。我想做的是在函数启动时显示加载图形,并在返回所有结果时清除图形。我的函数分解输入并调用定义数量的ajax请求 我读到没有直接的方法可以做到这一点。我试图设置一个函数来计算成功的请求,但我遇到了一个无法解决的逻辑障碍。我的基本提纲如下: 短暂性脑缺血发作 编辑以更新解决方案 解决方案是将ct创建为全局变量 我的工作代码大纲是 var ct = 0;//declare outside of fun

我试图找到一种方法来跟踪成功的ajax返回,只使用javascript,而不是jquery或其他LIB。我想做的是在函数启动时显示加载图形,并在返回所有结果时清除图形。我的函数分解输入并调用定义数量的ajax请求

我读到没有直接的方法可以做到这一点。我试图设置一个函数来计算成功的请求,但我遇到了一个无法解决的逻辑障碍。我的基本提纲如下:

短暂性脑缺血发作

编辑以更新解决方案

解决方案是将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调用之后,启动一个轮询器(setInterval),该轮询器检查响应计数变量是否与total requests变量匹配

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);

实际上,有一种非常简单的方法可以做到这一点:

从每个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
      }
    }
})();

您的
if
块中缺少了第二个
=
。感谢Adam,但这无法解决问题。感谢Brian,我将尝试该方法,并希望它适用于我的情况。感谢Martin,我认为这很好,但我需要动态生成“ajax\u done”变量的数量。您的解决方案和Brians的解决方案使我不得不声明一个全局变量,我对此犹豫不决,但它是有效的。我将在测试后分享解决方案。您不需要全局变量-使用闭包。看看我最新的答案,看看是怎么回事。包装代码的immediate函数充当其中声明的变量的局部作用域。