我可能在这里做一些非常愚蠢的事情。基本上用户可以拥有多个“站点”,对于每个站点,我们必须运行一些计算才能得出总数。我们有一个php页面可以进行这些计算,我们可以调用calculate.php
。它返回一个字符串ex:50
,然后我们将其解析为JS中的浮点数。所以这就是我要做的:获取calculate.php输出的所有数字的总和。
我的想法是遍历网站,$ .post()在每次迭代中计算.php(其他事情也在循环中完成,不太重要)并添加到回调函数中的变量。我相信我的问题是$ .post()是异步的...这是我的示例代码:
function systems(siteList){
var runningTotal = 0;
for (var ii=0,i<siteList.length,i++){
$.post("calculate.php",{foo:siteList[ii]},function(data){
// important part
runningTotal = runningTotal + data
})
}
//outside loop
alert(runningTotal)
}
这个功能可能不完美,但我真正的问题是如何才能达到我在这里寻找的结果?您知道,runningTotal始终使用上述代码警告为0.
由于
编辑:感谢大家的帮助。从我所看到的情况来看,使用这么多AJAX调用是不明智的,所以我不会直接解决这个问题,我相信我会退后一步并采取只发送一个ajax回调来执行任务的建议。总结给我。再次感谢答案 0 :(得分:8)
我建议使用$.when
并在完成所有Ajax调用后运行回调。此时您可以访问每个Ajax调用的响应,并且可以执行任何必要的计算。
例如:
function systems(siteList){
var promises = [];
for (var ii=0; i<siteList.length; i++){
// `$.post` returns a promise. We keep track of each promise.
promises.push($.post("calculate.php",{foo:siteList[ii]}));
}
$.when.apply($, promises).then(function() {
// this is called once the responses of all Ajax calls
// have been received
var sum = 0;
for (var i = 0, l = arguments.length; i < l; i++) {
sum += +arguments[i][0]; // value must be cast to number first
}
alert(sum)
});
}
查看jQuery文档以了解有关promises的更多信息:http://learn.jquery.com/code-organization/deferreds/。
总的来说,最好尽可能少地发出Ajax请求。如果您可以更改服务器端代码,我会将其更改为接受值列表,而不仅仅是一个值,并让服务器返回最终结果。
答案 1 :(得分:2)
我建议您在客户端(使用JavaScript)打包数据,并在一个AJAX请求中将其发送到服务器。多个请求会浪费带宽和时间。
或者,如果计算很简单并且不需要数据库或其他外部依赖项,只需将计算移动到javascript函数库并在客户端执行。
答案 2 :(得分:2)
暂且没有,应该有一个请求在服务器端(恕我直言)这样总结计算,使用计数器,当它达到0时你知道,你收集了所有结果:
function systems(siteList){
var runningTotal = 0;
var counter = 0;
for (var ii=0,i<siteList.length,i++){
counter++;
$.post("calculate.php",{foo:siteList[ii]},function(data){
// important part
runningTotal = runningTotal + data
counter--;
if(counter==0)
alert(runningTotal)
});
}
}
答案 3 :(得分:0)
不是很花哨,但您可以使用服务器上的文件来存储您的总计。
收到每个ajax请求后,read/update total/write
到服务器上的文件。
然后在收到特定请求(&request=send_total
)后发回该值,或以某种方式附加到每个请求的输出(50|3753
)。
答案 4 :(得分:-3)
AJAX 异步。
在AJAX回调中进行警报。