【问题标题】:javascript - keep track of successful ajax requests / returnsjavascript - 跟踪成功的 ajax 请求/返回
【发布时间】:2011-09-28 17:58:22
【问题描述】:

我正在尝试找到一种方法来跟踪成功的 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函数就可以了。

【问题讨论】:

  • 您在if 块中缺少第二个=
  • 谢谢亚当,但这并不能解决问题。

标签: javascript ajax


【解决方案1】:

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

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

【讨论】:

  • 感谢 Martin,我认为这很好,但我需要动态生成“ajax_done”变量的数量。您的解决方案和 Brians 解决方案使我不得不声明一个全局变量,我很犹豫,但它确实有效。测试后我会分享解决方案。
  • 您不需要全局变量 - 使用闭包。看看我更新的答案,看看如何。包装代码的立即函数充当其中声明的变量的局部范围。
【解决方案2】:

一种方法是保留一个变量来跟踪您提出了多少请求,另一个变量跟踪您收到了多少响应。然后,在您启动所有 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);

【讨论】:

  • 谢谢布赖恩,我会试试这个方法,希望它适用于我的情况。
猜你喜欢
  • 1970-01-01
  • 2017-08-17
  • 2017-12-11
  • 1970-01-01
  • 1970-01-01
  • 2018-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多