2009-02-24 56 views
0

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

我的问题是知道什么时候所有的ajax查询已经完成,并且所有的结果都已准备好并且已经准备就绪。

下面是现有的工作流程:

  1. 用户在查询框中输入数据并提交命中。
  2. 页面重新加载并在'scan_index'表格中插入'scan id'。
  3. 页面然后为13个查询中的每一个执行一个jquery $ .get函数(所有查询使用相同的javascript函数来执行他们的工作)。
  4. 随着每个结果被返回,结果将被插入'scans'表中,使用之前插入的'scan id'来允许与正确的扫描相关联。结果还会显示给用户以及结果的分数。

在这一点上,我会做的是使用scan_id值检索扫描表中的所有结果,并总计分数并将其显示给用户。

但我的问题是知道什么时候启动查询来检索所有总数。在完成(或失败)之前,任何给定的查询最多可能需要10秒(我的预定义超时值),但通常最多只需3秒即可完成。

因此,在不知道何时完成查询的情况下,如何知道所有查询何时完成?

回答

4

这听起来像是你缺少的关键信息是$ .get的回调函数。你可以指定一个函数作为第二个或第三个参数,当请求完成

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

时会触发所以你一个计数器变量的地方要建立的是被一个曾经为多数民众赞成由每个请求递增,那么在回调中会将此值减1。

然后,在您做出最终的获取请求之后,使用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 
     }) 
    } 
} 
2

使用的jquery ajaxStop()方法

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

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