Можно ли получить ответ jQuery ajax, а затем добавить задержку печати данных путем перебора массива - PullRequest
3 голосов
/ 03 апреля 2020

Внутри типичного ответа ajax вы просто распечатываете данные в div. Я хочу взять ответ данных и разделить его на массив, затем выполнить итерацию этого массива и добавить случайную задержку между добавлениями.

В этом конкретном примере c я разделяю ответ на каждый

тег. Затем я собираюсь добавить задержку перед печатью этих ответов.

Пока это не работает для меня. Он будет только полностью отображать ответ данных, даже если я переберу массив с setTimeout.

        //start the ajax
        $.ajax({
            //this is the php file that processes the data and send mail
            url: "/a_example.php?sim",  
            target:    '#crap',   // target element(s) to be updated with server response 
            //GET method is used
            type: "POST",

            //pass the data         
            data: data,     

            //Do not cache the page
            cache: false,

    success: function(data) {
                  var patt = /<p>(.*?)<\/p>/g;
                  var result = data.match(patt);
                var i;
                //alert(result.length);
                for (i = 0; i < result.length; i++) {
                    showResultMock(result[i]);

                }               


    },                  

    complete: function() {

        }

        });

function showResultMock(result){
 setTimeout(function(){  $('#modaldraftdetails .modal-body .draft-results').append(result); }, 2000);
}   

Ответы [ 3 ]

2 голосов
/ 03 апреля 2020

Попробуйте использовать рекурсию вместо итерации. Как то так:

const $resultsContainer = $('#results')
const results = [1,2,3]

function showResults(results) {
  if (!results.length) return
  setTimeout(function(){
    const result = results.shift()
    $resultsContainer.append(`<p>${result}</p>`)
    showResults(results)
  }, 2000)
}

showResults(results)
1 голос
/ 03 апреля 2020

Пока вы просматриваете результаты, вы в основном создаете пакет setTimeouts одновременно. Поэтому эти setTimeouts заканчиваются sh одновременно.

Попробуйте рекурсивное решение, что-то вроде этого:

/* Put this into the "success" callback */
var results = data.match(patt);
showResultMock(results, 0);

/* And this is your recursive fucntion's definition */
function showResultMock(results, i){
    if (i < results.length) {
        setTimeout(function(){  
            $('#modaldraftdetails .modal-body .draft-results').append(results[i]);
            showResultMock(results, ++i);
        }, 2000);
    }
}   
1 голос
/ 03 апреля 2020

Вы можете использовать function рекурсивно и использовать Math.random(), чтобы добавить случайную задержку, как показано ниже:

let ctn = $("#ctn"),
  results = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
  i = 0,
  maxDelay = 2000;

const printVal = val => {
  if (i < results.length) {
    //console.log(val);    
    ctn.append(`<span>${val}</span>`)
    setTimeout(() => {
      i++;
      printVal(results[i]);
    }, Math.random() * maxDelay)
  }
}

printVal(results[i])
span{ margin: 5px; font-family: courier; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="ctn"></div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...