Як періодично запускати запит AJAX?


113
<meta http-equiv="Refresh" Content="5">

Цей сценарій перезавантажує або оновлює сторінку кожні 5 секунд. Але я хочу це зробити за допомогою jQuery та AJAX виклику. Це можливо?

Відповіді:


281

Як зазначають інші, setInterval і setTimeout виконають свою справу. Я хотів виділити трохи більш досконалу техніку, яку я навчився з цього чудового відео Пола Ірландського: http://paulirish.com/2010/10-things-i-learned-from-the-jquery-source/

Для періодичних завдань, які можуть зайняти більше часу, ніж інтервал повторення (наприклад, HTTP-запит при повільному з’єднанні), краще не використовувати setInterval(). Якщо перший запит не виконано, а ви починаєте інший, ви можете опинитися в ситуації, коли у вас є кілька запитів, які споживають спільні ресурси та голодують один за одним. Ви можете уникнути цієї проблеми, чекаючи запланувати наступний запит до завершення останнього запиту:

// Use a named immediately-invoked function expression.
(function worker() {
  $.get('ajax/test.html', function(data) {
    // Now that we've completed the request schedule the next one.
    $('.result').html(data);
    setTimeout(worker, 5000);
  });
})();

Для простоти я використав зворотній виклик успіху для планування. Нижня сторона цього невдалого запиту зупинить оновлення. Щоб уникнути цього, ви можете використовувати повний зворотний дзвінок:

(function worker() {
  $.ajax({
    url: 'ajax/test.html', 
    success: function(data) {
      $('.result').html(data);
    },
    complete: function() {
      // Schedule the next request when the current one's complete
      setTimeout(worker, 5000);
    }
  });
})();

3
Це не схоже на рекурсивний виклик функції? Якщо так, то чи добре це давати тривалий час повторюватися, оскільки це рекурсивно? може бути випадком нескінченної рекурсії, поки Ajax успішно виконує
— Рахул Доул

1
Крім того, якщо ви використовуєте setTimeout, то чи є спосіб зупинити цей потік поза цим блоком коду? Як і в setInterval, ви можете просто зателефонувати clearInterval ().
— Рахул Доул

16
@RahulDole - це гарне запитання, але воно не є рекурсивним. Це не викликається безпосередньо з робочої функції, тому стек не продовжує зростати. Для другого моменту ознайомтеся з документами для setTimeout (), і ви побачите, що він повертає числовий ідентифікатор, який може бути переданий до clearTimeout ().
— велетенський

7
@RahulDole, якщо у вас є хром, пограйте з console.trace (), щоб побачити стек виклику функції. Функції, на які посилається setTimeout (), матимуть дуже короткий стек, і він точно не буде включати функцію, що називається setTimeout ().
— велетенський

1
@Anupal просто створити нове запитання.
— весело

34

Так, ви можете використовувати або setTimeout()метод JavaScript, або setInterval()метод, щоб викликати код, який ви хочете запустити. Ось як це можна зробити за допомогою setTimeout:

function executeQuery() {
  $.ajax({
    url: 'url/path/here',
    success: function(data) {
      // do something with the return value here if you like
    }
  });
  setTimeout(executeQuery, 5000); // you could choose not to continue on failure...
}

$(document).ready(function() {
  // run the first time; all subsequent calls will take care of themselves
  setTimeout(executeQuery, 5000);
});

1
Використовувати тільки setTimeout (ExecuteQuery, 5000); замість setTimeout ('ExecuteQuery ()', 5000); - це коротше і швидше.
— rsp

4

Ви можете використовувати setTimeoutабо setInterval.

Різниця полягає в тому, що setTimeout запускає вашу функцію лише один раз, і тоді ви повинні встановити її знову. setInterval продовжує ініціювати вираз знову і знову, якщо ви не скажете йому припинити


1

Я спробував код нижче,

    function executeQuery() {
  $.ajax({
    url: 'url/path/here',
    success: function(data) {
      // do something with the return value here if you like
    }
  });
  setTimeout(executeQuery, 5000); // you could choose not to continue on failure...
}

$(document).ready(function() {
  // run the first time; all subsequent calls will take care of themselves
  setTimeout(executeQuery, 5000);
});

Це не працювало так, як очікувалося протягом зазначеного інтервалу, сторінка не завантажувалася повністю і функція викликалася постійно. Краще зателефонувати на setTimeout(executeQuery, 5000);вулицю executeQuery()в окрему функцію, як показано нижче,

function executeQuery() {
  $.ajax({
    url: 'url/path/here',
    success: function(data) {
      // do something with the return value here if you like
    }
  });
  updateCall();
}

function updateCall(){
setTimeout(function(){executeQuery()}, 5000);
}

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

Це спрацювало точно так, як було задумано.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.