2016-05-24 8 views
1

Ich versuche, eine bestimmte for-Schleife alle x Sekunden auszuführen, aber kann nicht scheinen, SetInterval arbeiten. Ich bin mir sicher, dass meine Syntax falsch ist, aber ich kann es nicht richtig verstehen.setInterval für jQuery für Loop-Problem

Ich habe meine volle Code unten hinzugefügt:

jQuery:

//Click saves this.id as userID 
$(function() { 
    var rTitle, rText, qTitle, qText, numRows, userID; 
    $("#buttons").find(".btn").click(function() { 
    $(this).parent().toggleClass('fullscreen'); 
    $(this).parent().siblings().toggleClass('master'); 
    var userID = this.id; 

    //userID is then used for ajax to PHP script, information passed back is put in variables and generateProblems function is run 
    $.ajax({ 
     type: "POST", 
     url: 'include/responseget.php', 
     dataType: 'json', 
     data: { 
     userID: userID 
     }, 
     success: function(json) { 
     rTitle = json.rTitle; 
     rText = json.rText; 
     qTitle = json.qTitle; 
     qText = json.qText; 
     next = json.next; 
     numRows = json.numRows; 
     id = json.id; 
     generateProblems(); 
     } 
    }); 

    }); 
    //Generate draggable html with an interval of 1000 
    function generateProblems() { 
    $('<div>' + qTitle + '</div>').data('number', qTitle).attr('id', 'question').attr('class', 'bold').appendTo($("#" + id).parent()).hide().fadeIn(2000); 
    for (var i = 0; i < numRows; i++) { 
     setInterval(function() { 
     $('<div>' + rTitle[i] + '</div>').data('number', next[i]).attr('id', +next[i]).appendTo($("#" + id).parent()).draggable({ 
      containment: '.site-wrapper', 
      stack: '#testpile div', 
      cursor: 'move', 
      revert: true 
     }).hide().fadeIn(2000) 
     $('<div>' + rText[i] + '</div>').data('number', next[i]).attr('id', +next[i]).appendTo($("#" + id).parent()).hide().fadeIn(2000); 
     }, 1000); 
    } 

    //Rest of the code is not important, but I put it in nonetheless. 
    $('#testdrop').droppable({ 
     drop: handleDropEvent, 
     accept: '#testpile div' 
    }); 

    function handleDropEvent(event, ui) { 
     var problemNumber = ui.draggable.data('number'); 
     ui.draggable.draggable('disable'); 
     ui.draggable.draggable('option', 'revert', false); 
     $("#testpile").children().hide(); 

     $.ajax({ 
     type: "POST", 
     url: 'include/responseget.php', 
     dataType: 'json', 
     data: { 
      userID: problemNumber 
     }, 
     success: function(json) { 
      rTitle = json.rTitle; 
      rText = json.rText; 
      qTitle = json.qTitle; 
      qText = json.qText; 
      next = json.next; 
      numRows = json.numRows; 
      generateProblems(); 
     } 
     }); 

    } 
    } 
}); 

PHP:

<?php include 'login.php'; 
    if(isset($_POST['userID'])){ 
     $id = $_POST['userID']; 
     $stmt = $conn->prepare("SELECT DISTINCT AnswerTitle, AnswerText, QuestionTitle, QuestionText, Next FROM question_answers 
     INNER JOIN question 
     ON question_answers.QuestionID=question.QuestionID 
     INNER JOIN answer 
     ON question_answers.AnswerID=answer.AnswerID 
     WHERE AnswerGroup = ?;"); 
     $stmt->bind_param('s', $id); 
     $stmt->execute(); 
     $result = $stmt->get_result(); 

      while($row = $result->fetch_assoc()) 
      { 
       $rTitle_array[] = $row['AnswerTitle']; 
       $rText_array[] = $row['AnswerText']; 
       $qTitle = $row['QuestionTitle']; 
       $qText = $row['QuestionText']; 
       $next_array[] = $row['Next']; 
       $numRows = ($result->num_rows); 
      } 

     $response = array(
      'rTitle' => $rTitle_array, 
      'rText' => $rText_array, 
      'qTitle' => $qTitle, 
      'qText' => $qText, 
      'next' => $next_array, 
      'numRows' => $numRows, 
      'id' => $id 
     ); 

     echo json_encode($response); 
    } 

    // close connection 
    mysqli_close($conn); 
?> 
+0

Bitte beachten Sie mehrere ausgeführt werden ('numrows') setInterval Timer und nicht nur eine setInterval Timer wie Sie tun sollten. –

+0

In einem bestimmten Intervall läuft nicht eine Sache. Sie starten so viele Intervalle, wie Sie Zeilen erhalten. Wenn Sie also 10 Zeilen haben, werden 10 Intervalle gestartet, die alle gleichzeitig ausgeführt werden. –

+0

Ah, sehen Sie, das ist nicht, was ich versuche zu erreichen, ich versuche, 1 Intervall zu einer Zeit zu laufen und den HTML für jede Reihe, 1 nach dem anderen zu erzeugen. Es ist klar, dass ich setInterval an die falsche Stelle gesetzt habe und die falsche Syntax verwende. Haben Sie eine Idee für eine Lösung? Danke, dass du mir das Problem aufgezeigt hast. – user2304993

Antwort

1

Es klingt wie Sie versuchen, diese zu erhalten Effekt des Hinzufügens einer Zeile pro Sekunde. Sie könnten Rekursion verwenden.

Auch ist setInterval für zahlreiche Anrufe. setTimeout ist für einen einzelnen Anruf.

function generateProblems(i) 
{ 
    // if we're at the end then stop 
    if(i == numRows) return; 

    // wait 1000 
    setTimeout(function() 
    { 
     // do what you want with i here 

     // call the next iteration 
     generateProblems(i + 1); 
    }, 1000); 
} 

// then you kick it off with the 0 index 
generateProblems(0); 

Oder wenn Sie die erste Iteration wollen sofort kick off:

function generateProblems() 
{ 
    // if we're at the end then stop 
    if(i == numRows) return; 

    // do what you want with i here 

    // move to next row 
    ++i; 
    setTimeout(generateProblems, 1000); 
} 

// global var to keep track of where we are 
i = 0; 
generateProblems 
+0

Das scheint tatsächlich das zu sein, was ich versuche zu tun - das ist dein erster Vorschlag. Problem ist, ich versage es aus irgendeinem Grund zu arbeiten. Soll ich meinen Versuch hier als Kommentar posten? Weil deine Erklärung immer schön ist, aber ich muss etwas falsch machen. Danke auch für Ihre Hilfe und Zeit. – user2304993

+1

Scratch, ich habe es funktioniert, vielen Dank! – user2304993

+0

Wenn Sie nicht wollen, dass es 1 nach dem anderen passiert, dann könnten Sie es auch in eine for-Schleife legen. Nicht sicher, was das für die Leistung bringt, wenn Sie viele 'numRows' haben. – IMTheNachoMan