我有一个php / mysql / jquery Web应用程序,它对各种API进行13次ajax查询,并将结果存储在数据库表中。对于每个结果,我分配一个分数,当所有结果都完成后,我想显示一个“总分”。
我的问题是知道所有ajax查询何时完成并且所有结果都已准备就绪并且已准备就绪。
这是现有的工作流程:
此时我要做的是使用scan_id值检索扫描表中的所有结果,并将得分总计并显示给用户。
但我的问题是知道何时启动查询以检索所有总计。任何给定的查询在完成(或失败)之前最多可能需要10秒(我的预定义超时值),但它们通常最多只需要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
});