5
$(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 秒轮询一次。有什么建议么?

编辑:我应该补充一点,在请求完成后 5 秒会更好。

4

3 回答 3

7

看来您已经设法将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)

这应该在前一个完成后 5 秒调用 AJAX 轮询。

于 2012-06-27T11:41:03.300 回答
1

如果它应该每 5 秒轮询一次,而不一定是在完成最后一个请求后 5 秒,您可以使用 setInterval。不知道这是否可以接受,但这会使递归变得不必要。

function poll() {

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

setInterval(poll, 5000);
于 2012-06-27T10:16:01.693 回答
0

如果您想使用 jQuery 的 promise 语法,而不是回调语法,这是另一种整洁的方式。

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

poll();
于 2018-02-01T13:42:15.967 回答