setInterval для отложенного объекта jQuery - PullRequest
0 голосов
/ 21 мая 2018

Я пытаюсь лучше понять использование отложенных объектов в jQuery.

Приведенный ниже метод getData извлекает некоторые данные асинхронно.Когда это будет сделано, оно должно отображаться в некотором предопределенном (log) разделе с помощью addToChart.Это должно происходить периодически, поэтому я использую setInterval внутри обработчика getData done.

function getData() {
    return $.ajax({
        url: 'https://demo-live-data.highcharts.com/time-data.csv',
        type: 'GET'
    });
}
getData().done(addToChart, function() {
    setInterval(getData, 1000);
});

function addToChart(data) {
    document.getElementById('log').innerText += data;
}

$(document).ready(function() {
    getData();
});

В приведенном выше коде, getData, кажется, вызывается только один раз.Как я могу позволить, чтобы это вызывалось периодически?

Кроме того, есть ли способ отладить этот код, а не запускать его и чесать голову, почему он не ведет себя так, как ожидалось?(Я новичок в JavaSCript, если вам интересно).Я прошел по коду с помощью отладчика Firefox, но это не помогло.

Ответы [ 3 ]

0 голосов
/ 21 мая 2018

setTimeout используется для задержки функции https://www.w3schools.com/jsref/met_win_settimeout.asp

То, что вы хотите использовать, это setInterval https://www.w3schools.com/jsref/met_win_setinterval.asp

Итак, глядя на то, что вы пытаетесь сделать, я бы сделал этокак это:

$(document).ready(function() {
    function getData() {
        $.ajax({
            url: 'https://demo-live-data.highcharts.com/time-data.csv',
            type: 'GET'
        }).done(addToChart);
    }

    function addToChart(data) {
        document.getElementById('log').innerText += data;
    }

    setInterval(getData, 1000);
});
0 голосов
/ 21 мая 2018

Переместите done в функцию, чтобы она вызывалась каждый раз, когда функция выполняется, и запрос завершается

function getData() {
  return $.ajax({
      url: 'https://demo-live-data.highcharts.com/time-data.csv',
      type: 'GET'
    })
    .then(addToChart)
    .always(function() {
      setTimeout(getData, 1000);
    });
}

Альтернативный подход заключается в переносе того, что вы сейчас делаете, в новую функцию

function getData() {
  return $.ajax({
    url: 'https://demo-live-data.highcharts.com/time-data.csv',
    type: 'GET'
  });
}

function loadChart() {
  getData()
    .then(addToChart)
    .always(function() {
      setTimeout(loadChart, 1000);
    });

}

loadChart()
0 голосов
/ 21 мая 2018

Вам потребуется выполнить цикл while:

while (condition) {
    code block to be executed
}

или цикл do / while:

do {
    code block to be executed
}
while (condition);
...