如何知道 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?