2016-05-31 2 views
0

何度も尋ねられていますが、closureというものが出てくると思いますが、少なくとも自分のコードに適用できないようです。forループでAjaxを呼び出すと、同じ値が一度だけ返されます

ここでは、.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の大成功は、それがfull

クラスが動作し、適用 1data-idで最初 choiceクラスの echo json_encode(array("value" => $value, "count"=> $counter, "ID" => $choiceID));

コールバック

しかし、私はconsole.logに0123それはなど1/2/3/4data-idとは何か(私はそれがすべてoneされるべきだと思う)が、私は1にそれらすべてを置くとき、それはちょうど最初のもののために働くおそらくeen 1 とコンソールに VM1982:1 Uncaught SyntaxError: Unexpected token < in JSON at position 1を返しとcount1/2/3/4data-idとして使用したのと同じです。また、いくつかの結果と、それはそれはそれは2のcount持ち、AJAXにそれがcount =上記0それはクラスfullを与えるsould時に言うが、それはundefined index: choice_2代わり

Iを与えると言う<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"}を返すことにちょっと奇妙ですこれが主な問題

そして私console.logvalueそれはchoiceクラスのfirst値であるeenを返すsucces機能の内部の原因だと思います。

valueの変数valueの下にある場合、それはすべての変数を返します。

答えて

0

問題はelement,choiceIDおよびvalueはすべて同期的に変化しています。 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... 
    })(); 
} 

、毎回ループの実行、elementchoiceID、およびvalueは、それらの値が正しく閉鎖にバインドされていますを作るコーディング最も簡単な変更です。


あなたはそれ以外の場合は、すぐに呼び出される関数の式(生命維持)に渡されたことを確認するのが一般的だが、iイテレータを使用していません。とにかく

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

、これは一般的に不正なコード設計のすべてのちょうど症状です。関数を使用してコードの別の操作を記述した場合(forループ内の1つの巨大なブロブの代わりに)、この問題は決して最初に起きたことはありませんでした。

0

私はあなたが物事のカップル変更する必要が信じている:JavaScriptで今

$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; 
} 

を、あなたがゼロでないレスポンスを解析する必要があります。

関連する問題