【问题标题】:using $.post() within a loop在循环中使用 $.post()
【发布时间】:2013-08-01 11:25:29
【问题描述】:

我可能在这里做一些非常愚蠢的事情。基本上,一个用户可以有多个“站点”,对于每个站点,我们必须进行一些计算才能得出一个总数。我们有一个 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 回调来执行任务的建议为我总结。再次感谢

【问题讨论】:

  • “我相信我的问题是 $.post() 不是异步的” 不,问题是它异步的。
  • 对不起,我是这个意思
  • @collapsar:第二个参数是你想通过请求传递的数据。
  • @FelixKling:仔细阅读会赢得胜利。抱歉,我跳过了文档中的重要部分,谢谢提示
  • 我不确定这个问题是否应该作为重复问题关闭,但这是一个非常相似的问题(顺便说一句,我提供了相同的答案):stackoverflow.com/questions/8726046/…

标签: javascript jquery post


【解决方案1】:

我建议使用$.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 请求。如果您可以更改服务器端代码,我会将其更改为接受一个值列表,而不仅仅是一个值,并让服务器返回最终结果。

【讨论】:

  • 人们似乎同意这个答案,我会试一试,非常感谢
【解决方案2】:

我建议您在客户端(在 JavaScript 中)打包您的数据,并在一个 AJAX 请求中将其发送到服务器。多个请求浪费带宽和时间。

或者,如果计算很简单并且不需要数据库或其他外部依赖项,只需将计算移至 javascript 函数库并在客户端完成。

【讨论】:

  • 我也想知道这个......这些也不是我们做的唯一 ajax 请求,我们在同一页面上还有其他几个。
  • 但不幸的是它们确实有外部依赖... sql查询
【解决方案3】:

撇开可能应该有一个请求在服务器端(恕我直言)进行这种总结计算,使用计数器,当它达到 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)
           });

    }

}

【讨论】:

    【解决方案4】:

    不是很花哨,但您可以使用服务器上的文件来存储您的运行总计。

    当收到每个 ajax 请求时,read/update total/write 到服务器上的一个文件。

    然后在收到特定请求 (&amp;request=send_total) 后将该值发回,或者以某种方式附加到每个请求的输出 (50|3753)。

    【讨论】:

      【解决方案5】:

      AJAX 是异步的

      在 AJAX 回调中发出警报。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多