Ajax调用for循环仅返回相同的值一次

时间:2016-05-31 09:16:42

标签: javascript php jquery ajax

我知道它被多次询问但我似乎无法找出closure的东西,至少我似乎无法将它应用到我自己的代码中。

这里我基于.choice类创建了一个for循环。

   <label class="choice" data-id="1"><input type="radio" name="group1" value="een">een</label>
   <label class="choice" data-id="2"><input type="radio" name="group1" value="twee">twee</label>
   <label class="choice" data-id="3"><input type="radio" name="group1" value="drie">drie</label>
   <label class="choice" data-id="4"><input type="radio" name="group1" value="vier">vier</label>

$(document).ready(function(){
for (var i = $('.choice').length - 1; i >= 0; i--) {
    var element = $('.choice')[i];
    var choiceID = $(element).data('id');
    var value = $(element).find('input').val();

    $.ajax({
        method: "POST",
        url: 'api.php',
        data: {
            choiceID: choiceID, 
            value: value
        },
        success: function(res) {

            if(value == JSON.parse(res).value) {
                console.log(JSON.parse(res).value);
                console.log(JSON.parse(res).count);
                if(JSON.parse(res).count > 0){
                    $(element).addClass('full');
                }
            } else {
                // console.log("FAILED " + JSON.parse(res).value);
                // console.log("FAILED " + JSON.parse(res).count);
            }
        }
    });

}

});

然后在api.php文件中,我调用多个查询

$choiceID = $_POST["choiceID"];
$value = $_POST["value"];
$kolom = "choice_" . $choiceID;

$counter = 0;
$array = [];

$query = "SELECT choice_1 FROM resultaten WHERE choice_1 = '".$value."'";
$getCount = $db->query($query);
$getCount->execute(array("value"=>$value));
$results = $getCount->fetchAll(PDO::FETCH_ASSOC);

more queries and for loops ajax成功回调 echo json_encode(array("value" => $value, "count"=> $counter, "ID" => $choiceID));

适用于choice data-id1的{​​{1}}课程,并且适用课程full

但是当我在console.log中valuecount时,它会返回een 1 并在控制台中  VM1982:1 Uncaught SyntaxError: Unexpected token < in JSON at position 1可能与data-id的{​​{1}}等有关(我认为它应该都是1/2/3/4)但是当我把它们全部放到one时只适用于第一个。与我使用1作为1/2/3/4的情况相同。同样有点奇怪的是它有一些结果返回data-id它表示它的<br /> <b>Notice</b>: Undefined index: choice_2 in <b>C:\xampp\htdocs\form\api.php</b> on line <b>47</b><br /> {"value":"use your apple","count":2,"ID":"2"}为2,而在ajax中它表示当count =大于0时它会给出类{{} 1}}但是它会给count而不是

  

我认为这会导致主要问题

当我在full函数内undefined index: choice_2 console.log时,它会返回value succes类的een值。

当我first choice变量下面的console.log时,它会返回所有变量。

2 个答案:

答案 0 :(得分:0)

我相信你必须改变一些事情:

$choiceID = $_POST["choiceID"];
$value = $_POST["value"];
$kolom = "choice_" . $choiceID;

$counter = 0;
$array = [];

$query = "SELECT choice_1 FROM resultaten WHERE $kolom = '".$value."'";
$getCount = $db->query($query);
$getCount->execute(array("value"=>$value));
$results = $getCount->fetchAll(PDO::FETCH_ASSOC);

if (count($results ) {
    echo json_encode($results );
} else {
    echo 0;
}

现在在javascript中,你应该解析非零响应。

答案 1 :(得分:0)

问题是elementchoiceIDvalue都在同步更改。当AJAX响应返回时,值与每个请求开始时的值不同。

这可能是您编写的最简单的更改

for (var i = $('.choice').length - 1; i >= 0; i--) {
  (function() {
    var element = $('.choice')[i];
    var choiceID = $(element).data('id');
    var value = $(element).find('input').val();

    // rest of your loop code here...
  })();
}

现在,每次循环运行时,elementchoiceIDvalue都会将其值正确绑定到闭包。

你没有使用i迭代器,否则通常会看到传递给立即调用的函数表达式(IIFE)。

for (var i = $('.choice').length - 1; i >= 0; i--) {
  (function(i) {
    // your loop code here
  })(i);
}

无论如何,这只是一般代码设计不良的症状。如果您使用函数来描述代码的单独操作(而不是for循环中的一个巨型blob),那么您将永远不会遇到此问题。