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

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

看来你已经设法把你的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 轮询。

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

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

如果你想使用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();

相关内容

  • 没有找到相关文章

最新更新