1

我在 JQuery 和 php 上编写了示例。Jquery 已插入帖子查询。结果,页面必须查看 9 行。JQuery+HTML 上的代码:

<script type="text/javascript">

$(document).ready(function(){
$.post("test.php", {'test': "test"},
function (result) {
    for (var i = 0; i < result; i++) {
         $.post("test.php", {'test': "test2"},
            function (result2) {
                for (var j = 0; j < result2; j++) {
                    $("#test").append("<p>i="+i+" , j= "+j+" </p>");                    
                }
            }
         );
      }
  }
 );
});

</script>
<div id="test"></div>

test.php 有以下代码:

<?php
$id=$_POST["test"];
echo '3';
?>

我有下一个结果:

i=3 , j= 0
i=3 , j= 1
i=3 , j= 2
i=3 , j= 0
i=3 , j= 1
i=3 , j= 2
i=3 , j= 0
i=3 , j= 1
i=3 , j= 2 

为什么 i=3?这个怎么修?我需要这样:

i=0 , j= 0
i=0 , j= 1
i=0 , j= 2
i=1 , j= 0
i=1 , j= 1
i=1 , j= 2
i=2 , j= 0
i=2 , j= 1
i=2 , j= 2
4

2 回答 2

4

请记住,AJAX 调用是异步的。您正在使用i循环来触发这些请求,但几乎可以保证 javascript 代码的运行/完成速度比 ajax 请求(这只是一个普通的 http 请求,请记住)可以转到服务器并返回。当他们回来的时候,你的i循环已经完成,并且i将在循环中分配最后一个值。在你的情况下,这恰好是 3。

如果您为更长的循环执行此操作,您可能会走运并在该i循环仍在执行时返回一些响应,在这种情况下,您可能会在某处看到输出的不同值。

要回答您的实际问题,您需要i连同其余的 ajax 请求一起发送,这样您就可以确定您从哪个请求中得到答案。请记住,每个.post()调用都将是一个单独的 HTTP 请求,并且不能保证您会以最初请求它们的相同顺序获得答案。有些请求可能会受到 net.lag 的影响,或者采用不同的路线并最终在稍后的请求后返回,因此将您的代码更改为:

     $.post("test.php", {'test': "test2", i: i},

然后将其i与答案一起返回:

<?php
   $test = $_POST['test'];
   $i = $_POST['i'];
   echo "$i 3";
于 2013-08-15T20:07:26.943 回答
0

正如 Marc B 指出的那样,AJAX 调用是异步的。如果您想通过使用jQuery 的asyncajax()选项来禁用此行为(尽管在 POST 中传递 i 的值的解决方案可能更好)

$.ajax({
    type: "POST",
    url: "test.php", 
    async: false,
    data: {test: "test"}
}).done( function (result) {
    for (var i = 0; i < result; i++) {
         $.ajax({
             type: "POST",
             url: "test.php",
             async: false,
             data: {test: "test2"}
         }).done(function (result2) {
             for (var j = 0; j < result2; j++) {
                 $("#test").append("<p>i="+i+" , j= "+j+" </p>");                    
             }
         });
     }
});
于 2013-08-15T20:24:53.210 回答