我可能在这里做了一些非常愚蠢的事情。基本上一个用户可以有多个“站点”,对于每个站点,我们必须运行一些计算来得出总数。我们有一个执行这些计算的 php 页面,我们可以将其称为 calculate.php
。它返回一个字符串 ex: 50
然后我们将其解析为 JS 中的 float。所以这就是我想要做的:获取 calculate.php 输出的所有数字的总和。
我的想法是遍历站点,在每次迭代中从 $.post() 到 calculate.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 回调来执行任务的建议为我总结。再次感谢
最佳答案
我建议使用 $.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 文档以了解有关 promise 的更多信息:http://learn.jquery.com/code-organization/deferreds/ .
不过,一般来说,发出尽可能少的 Ajax 请求会更好。如果您可以更改服务器端代码,我会将其更改为接受一系列值,而不仅仅是一个值,并让服务器返回最终结果。
关于javascript - 在循环中使用 $.post(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17978808/