2016-05-24 4 views
1

Я пытаюсь запустить конкретный цикл цикла каждые x секунд, но не может заставить makeTestInterval работать. Я уверен, что мой синтаксис неверен, но я не могу понять, что это правильно.setInterval для jQuery для проблемы с контуром

Я добавил мой полный код ниже:

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

Пожалуйста, обратите внимание, вы работаете несколько ('numrows') setInterval таймер, а не только один setInterval таймер, как вы должны делать. –

+0

Вы не используете одну вещь за определенный интервал. Вы запускаете столько интервалов, сколько получаете строки. Итак, если у вас 10 строк, вы запустите 10 интервалов, все будут работать одновременно. –

+0

А, видите, это не то, чего я пытаюсь достичь, я пытаюсь запустить 1 интервал за раз и сгенерировать html для каждой строки, 1 за другой. Понятно, что я поставил setInterval в неправильное место, а также использовал неправильный синтаксис. Есть идеи для решения? Кроме того, спасибо, что указал на проблему. – user2304993

ответ

1

Это звучит как вы пытаетесь получить это эффект добавления одной строки каждую секунду. Вы можете использовать рекурсию.

Кроме того, setInterval для многочисленных звонков. setTimeout для одного звонка.

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); 

Или, если вы хотите, чтобы первая итерация стартует сразу:

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

Это действительно похоже на то, что я пытаюсь сделать - ваше первое предложение. Проблема в том, что я не могу заставить ее работать по какой-то причине. Должен ли я опубликовать свою попытку в качестве комментария здесь? Потому что ваше объяснение довольно во всем, но я должен что-то ошибаться. Кроме того, благодарю вас за помощь и время. – user2304993

+1

Поцарапайте это, я получил его, спасибо вам большое! – user2304993

+0

Если вы не хотите, чтобы это произошло один за другим, вы могли бы поместить его в цикл for. Не уверен, что это будет делать с производительностью, если у вас много 'numRows'. – IMTheNachoMan

Смежные вопросы