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

Posted

技术标签:

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

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

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

这是现有的工作流程:

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

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

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

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

【问题讨论】:

【参考方案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
        );

【讨论】:

以上是关于如何知道 jquery $.get ajax 调用何时完成?的主要内容,如果未能解决你的问题,请参考以下文章

使用带有摘要身份验证、jquery ajax 调用的 RestFul PHP Web 服务

如何从 jQuery ajax 调用将复杂对象传递给 ASP.NET WebApi GET?

Laravel - 如何通过 AJAX (jQuery) 调用控制器函数

如何调试 jquery AJAX 调用?

使用 jQuery 的跨站 AJAX

使用 jQuery 的跨站 AJAX