jQuery递归ajax poll使用setTimeout来控制轮询间隔

时间:2012-06-27 10:10:46

标签: ajax jquery ajax-polling

$(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秒钟添加。

3 个答案:

答案 0 :(得分: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投票。

答案 1 :(得分:1)

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

function poll() {

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

setInterval(poll, 5000);

答案 2 :(得分:0)

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

void get_response()
{
     WebClient wp = new WebClient();
     string url="your json url";
     var response=wp.DownloadString(url)
     get_data(response)
}


void get_data(string response)
{
    datagridview.Rows.clear();`enter code here`
    JArray fetch= JArray.Parse(response);
    if(fetch.Count()>0)
    {
        for(int i=0;datagridview.Rows.Count>i;i++)
        {
            int n=datagridview.Rows.Add();
            datagridview.Rows[n].Cells[0].Value=fetch[i]["Json 
            ObjectName1"].ToString();
        }
    }
}