如何知道jquery $ .get ajax调用何时完成?

时间:2009-02-24 01:11:47

标签: php jquery mysql ajax get

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

我的问题是知道所有ajax查询何时完成并且所有结果都已准备就绪并且已准备就绪。

这是现有的工作流程:

  1. 用户在查询框中输入数据并点击提交。
  2. 页面重新加载并将'scan id'插入'scan_index'表。
  3. Page然后为13个查询中的每一个执行jquery $ .get函数(所有查询都使用相同的javascript函数来执行他们的工作)。
  4. 在返回每个结果时,使用先前插入的“扫描ID”将结果插入“扫描”表中,以允许与正确扫描相关联。结果也会显示给用户以及该结果的分数。
  5. 此时我要做的是使用scan_id值检索扫描表中的所有结果,并将得分总计并显示给用户。

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

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

3 个答案:

答案 0 :(得分: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回调本身,但这似乎可能容易受到计时问题的影响。

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

答案 1 :(得分: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 :(得分:2)

使用jquery ajaxStop()方法

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

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