0

我有一个带有一些复选框和提交按钮的页面。我使用 AJAX 将复选框值发布到 PHP 脚本 calc.php,使用数据运行一些计算并将结果分配给 PHP 会话变量。我有另一个 PHP 脚本 json.php,它获取该会话数据并将其编码为 JSON,以便 jquery 显示在 div 中。我的问题是我允许用户设置他们要提交的数据集的数量,子编号,当用户更改数据集的数量时,我的显示循环会不同步。

例如,如果他们从 3 个数据集开始,他们通过按 #button 来逐一提交。在最后一组之后, if (count == max) 运行并且。现在,他们可以根据需要进行另一次计算并更改数据集的数量。如果他们将其更改为 2,则输出变为 4,而不是重置为 1 并清空#log。

$("#button").click(function() {
$.ajax({
  type: "POST",
  url: "calc.php",
  data: $("form#checkboxes").serialize(),
  success: function(data) {
    if(document.getElementById('calc').checked) {
    var max = checkboxes.subnumber.value;
    var stop = Number(max) + 1;
    count++;
    output++;
    $.getJSON('json.php', function(data) {
      $.each(data, function(key, val) {
        $('#log').append(output);
        $('#log').append(val.result);
        $('#log').append("</br>");
      })
    })
    if (count == max){
      count = 0;
      $("#results").load('results.php')
    }
if(output == stop) {
  $("#log").empty();
  output = 1;
}
}
}
})
}

我知道这很简单,但我已经尝试修复它两个小时,但无法找出问题所在。其他一切都完美无缺,只是输出计数器没有正确完成。

4

1 回答 1

0

您正在对 JSON 进行异步调用。如果用户做事如此之快以至于电话无法正常返回,那么问题就出在那儿。

你有两个选择:

  1. 同步运行所有 JSON(在 JSON 调用中使用 async:false)
  2. 利用计数器并仅处理返回当前索引的事件。

#2 的伪代码:

var pCounter = 0;
function doSomeAjax()
{
    pCounter++;
    $.ajax('url',{
        data:{count:pCounter}
        success:function(data)
            {
                // your json should return the current counter index
                if (data.counter != pCounter) return;
                // execute normally.
            }
    });
}
于 2012-07-01T05:42:07.533 回答