Выполнять запрос Ajax каждую секунду

У меня есть вызов ajax в php файл. Я получаю результаты. Теперь я исследую, возможно ли, чтобы запрос ajax автоматически выполнялся каждые 1 секунду. Я публикую результаты в поле ввода, которое называется hidden. Как я могу выполнить вызов ajax каждые три секунды без вызова функции?

    $.ajax({
            type: 'POST',
            url: 'increment.php',
            data: $(this).serialize(),
            dataType: 'json',
            success: function (data) {
                    $('#hidden').val(data);// first set the value     

            }
    });

Ответ 1

Что-то, что вы, возможно, захотите рассмотреть, это Server Sent Events (SSE)

Это технология HTML5, в которой Javascript будет " долгого опроса " конечной точки сервера (ваш файл PHP), чтобы узнать, произошли ли какие-либо изменения. Длительный опрос - это в основном, где JS (я не уверен, использует ли он Ajax или другую технологию) каждую секунду отправляет запрос в конечную точку

Вы можете попробовать:

#/your_js
var evtSource = new EventSource("increment.php");
evtSource.onmessage = function(e) {
    $('#hidden').val(e.data);
}

Чтобы отправить данные, вы можете сделать ajax-вызов, который отправит обновленный объект JSON на сервер, например, у вас есть:

  $(document).on("click", ".your_object", function(data) {
     $.ajax({
                type: 'POST',
                url: 'increment.php',
                data: $(this).serialize(),
                dataType: 'json'
        });
   });

Это вызовет только запрос Ajax при выполнении события, и ваше приложение будет "слушать" ответ каждую секунду. Как вам известно, длинный опрос Ajax является супер-ресурсоемким, поэтому лучше смотреть на материал в Интернете, если вы хотите использовать настоящую технологию "в реальном времени", но в любом случае это будет гораздо более эффективная система чем просто использовать простой ajax для всего

Предостережение здесь - вам нужно будет изменить ваш increment.php для обработки различных типов ответов

Ответ 2

Вы можете сделать это с помощью повторной серии вызовов setTimeout. (Не используйте setInterval с вызовами ajax, вы получите хаос в setInterval сроки; setInterval отключит следующий вызов ajax, даже если предыдущий еще не завершен.)

Используйте setTimeout для планирования первого вызова, а затем, когда он завершится, чтобы запланировать следующий и т. Д.:

var interval = 1000;  // 1000 = 1 second, 3000 = 3 seconds
function doAjax() {
    $.ajax({
            type: 'POST',
            url: 'increment.php',
            data: $(this).serialize(),
            dataType: 'json',
            success: function (data) {
                    $('#hidden').val(data);// first set the value     
            },
            complete: function (data) {
                    // Schedule the next
                    setTimeout(doAjax, interval);
            }
    });
}
setTimeout(doAjax, interval);

Обратите внимание, что я использую complete, а не success, чтобы запланировать следующий вызов, так что прерывание (временное падение в вашем "сетевом соединении", независимо от того, что) не убивает процесс.

Ответ 3

Да возможно использование setInterval

1) Держите ajax в функции.

function fun() {
$.ajax({
            type: 'POST',
            url: 'increment.php',
            data: $(this).serialize(),
            dataType: 'json',
            success: function (data) {
                    $('#hidden').val(data);// first set the value     

            }
    });
}

2) Теперь, используя setInterval, вы можете выполнять его каждую секунду.

var interval = setInterval(fun, 1000);

3) Для паузы/очистки используйте clearInterval

clearInterval(interval);

4) Поскольку другие указали, что использование setInterval для ajax не является разумным, попробуйте использовать

var interval;
function callAjax() {
  $.ajax({
                type: 'POST',
                url: 'increment.php',
                data: $(this).serialize(),
                dataType: 'json',
                success: function (data) {
                        $('#hidden').val(data);// first set the value 
                        interval = setTimeout(callAjax, 1000);   
                }
        });
}
callAjax();
//clearTimeout(interval);