2016-05-31 99 views
0

我知道它已被多次询问,但我似乎无法将closure的东西找出来,至少我似乎无法将它应用于我自己的代码。Ajax调用for循环仅返回相同的值一次

这里我创建了一个基于.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));

第一个choice1data-id它的工作原理和应用类full

但是当我console.log的valuecount返回een 1 并在控制台 VM1982:1 Uncaught SyntaxError: Unexpected token < in JSON at position 1或许事做的1/2/3/4data-id(我想应该都是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 count,并在阿贾克斯它说当count以上= 0它前人的精力给类full,但它给人的undefined index: choice_2代替

我认为这将导致主要问题

当我console.logvaluesucces函数返回een这是choice类的first值内。

而当我console.logvalue低于value变量时,它会返回所有变量。

回答

0

问题是element,choiceIDvalue都在同步变化。到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),那么您将从来没有遇到过这个问题。

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中,你应该分析非零响应。