【问题标题】:How to know when jquery $.get ajax calls have completed?如何知道 jquery $.get ajax 调用何时完成?
【发布时间】:2010-10-09 11:15:13
【问题描述】:

我有一个 php / mysql / jquery Web 应用程序,它对各种 API 进行 13 个 ajax 查询并将结果存储在数据库表中。我为每个结果分配一个分数,当所有结果完成后,我想显示一个“总分”。

我的问题是知道所有 ajax 查询何时完成并且所有结果都已输入并准备好进行统计。

这是现有的工作流程:

  1. 用户在查询框中输入数据并点击提交。
  2. 页面重新加载并将“扫描 ID”插入到“扫描索引”表中。
  3. 页面然后为 13 个查询中的每一个执行一个 jquery $.get 函数(所有查询都使用相同的 javascript 函数来执行它们的工作)。
  4. 在返回每个结果时,使用先前插入的“扫描 ID”将结果插入到“扫描”表中,以允许与正确的扫描相关联。结果还会连同该结果的分数一起显示给用户。

此时我要做的是使用 scan_id 值检索扫描表中的所有结果,并将分数加起来并显示给用户。

但我的问题是知道何时开始查询以检索所有总数。任何给定的查询在完成(或失败)之前最多可能需要 10 秒(我预定义的超时值),但它们通常最多只需要大约 3 秒即可完成。

那么,在不知道查询何时完成的情况下,我如何知道所有查询何时完成?

【问题讨论】:

    标签: php jquery mysql ajax get


    【解决方案1】:

    听起来您缺少的关键信息是 $.get 的回调功能。您可以指定一个函数作为请求完成时触发的第二个或第三个参数

    $.get('http://example.com/data', {'foo':'bar'}, function(resonseData){
        //code here will be called when the ajax call has completed
    })
    

    因此,您需要在某处设置一个计数器变量,每次发出的请求都会加一,然后在回调中将此值减一。

    然后,在您发出最终的 get 请求后,使用 setInterval 设置一个观察程序,该观察程序将定期(例如每秒一次)检查计数器是否为零。如果是,您已完成所有请求。您可能可以将此检查添加到 $.get 回调本身,但这似乎很容易受到时间问题的影响。

    这是基本的解决方案,但可以轻松地将其抽象为更健壮/优雅的排队解决方案。

    【讨论】:

      【解决方案2】:

      这是另一种选择。代码可能需要调整,我没有实际测试它,但这是一个开始。

      var complete = 0;
      
      function submitRequests () {
          $.get("http://server/query1", {"data": "for Query"}, processResult(1));
          $.get("http://server/query2", {"data": "for Query"}, processResult(2));
          //...
          $.get("http://server/query13", {"data": "for Query"}, processResult(13));
      }
      
      function processResults (query) {
          complete += Math.pow(2,(query-1));
          if (complete == 8191) {
              $.get("http://server/results", scanid, function() {
                  //Show results
              })
          } 
      }
      

      【讨论】:

        【解决方案3】:

        使用 jquery ajaxStop() 方法

                $(document).ajaxStart(function () {
                    //first ajax call started
                });
        
                $(document).ajaxStop(function () {
                    //last ajax call stopped
                });
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-10
          • 2016-12-05
          • 2016-11-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多