2016-05-31 110 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中,你應該分析非零響應。