jQuery рекурсивный опрос ajax с использованием setTimeout для управления интервалом опроса

$(document).ready(function() {
    (function poll() {
        setTimeout(function() {
            $.ajax({
                url: "/project1/api/getAllUsers",
                type: "GET",
                success: function(data) {
                    console.log("polling");
                },
                dataType: "json",
                complete: poll,
                timeout: 5000
            }), 5000
        });
    })();
});​

Это просто продолжает работать так быстро, как сервер может ответить, но я надеялся, что он будет опрашивать только каждые 5 секунд. Какие-либо предложения?

EDIT: Я должен добавить, что через 5 секунд после завершения запроса будет предпочтительнее.

 Richard Neil Ilagan27 июн. 2012 г., 12:13
Кажется, он выполняет следующий опрос AJAX через 5 секунд после завершения предыдущего. Что по этому поводу вы хотите изменить? Лучше всего я могу понять ваш вопрос, это было то, что вы хотели.
 Richard Neil Ilagan27 июн. 2012 г., 13:41
Извините, только что вышел на ужин. Взглянул еще раз и обнаружил, что, кажется, ты ошибаешься. Выскочил ответ ниже.
 chrisjleu27 июн. 2012 г., 12:33
@Richard Neil Ilagan: Я хочу, чтобы он выполнялся примерно каждые 5 секунд (через 5 секунд после выполнения запроса ajax также все в порядке, и мне сказали, что лучше практиковать), но я замечаю, что запрос выполняется гораздо быстрее, как будто это игнорирование 5-секундной задержки.

Ответы на вопрос(3)

Решение Вопроса

setTimeout Задержка аргумента написана не в том месте.

$(document).ready(function() {
  (function poll() {
    setTimeout(function() {
        $.ajax({
            url: "/project1/api/getAllUsers",
            type: "GET",
            success: function(data) {
                console.log("polling");
            },
            dataType: "json",
            complete: poll,
            timeout: 5000
        }) //, 5000  <-- oops.
    }, 5000); // <-- should be here instead
  })();
});​

Если вы будете следовать брекетам, вы увидите, что вы звонитеsetTimeout лайк:

setTimeout(function () {
    $.ajax(), 5000
})

и должно быть

setTimeout(function () {
    $.ajax();
}, 5000)

Это должно вызвать опрос AJAX через 5 секунд после завершения предыдущего.

 27 июн. 2012 г., 14:48
Нет, все хорошо, я бы сказал. Случается с лучшими из нас. Удачи с этим. :)
 chrisjleu27 июн. 2012 г., 14:40
Да, это было - глупая ошибка. Благодарю.

а не обязательно через 5 секунд после завершения последнего запроса, вы можете использовать setInterval. Не знаю, приемлемо ли это, но это сделает ненужным рекурсию.

function poll() {

            $.ajax({
                url: "/project1/api/getAllUsers",
                type: "GET",
                success: function(data) {
                    console.log("polling");
                },
                dataType: "json"
        });
    }

setInterval(poll, 5000);

если вы хотите использовать синтаксис обещаний jQuery, а не синтаксис обратного вызова, это еще один аккуратный способ.

function poll() {
    $.get('http://your-api-endpoint.com')
    .done(function() {
        // 200 - OK response
    })
    .fail(function() {
        // Error Response
    })
    .always(function () {
        setTimeout(function() {
            poll();
        }, 5000);
    });
}

poll();

Ваш ответ на вопрос