3

我之前使用以下 jQuery Ajax 请求每 3 秒从服务器轮询一次使用 Ajax 的问题:

function getData() {
    $.ajax({
        url : 'http://example.com',
        type: 'GET',
        success : function(data) {
            // process data here
            setTimeout(getData, 3000);
        },
        dataType : 'json'
    });
}

似乎另一种方法是将 setTimeout 放在 $.ajax() 块之外:

function getData() {
    setTimeout( function() {
    $.ajax({
        url : 'http://example.com',
        type: 'GET',
        success : function(data) {
            //process data here
        },
        dataType : 'json'
    }) }, 3000);
}

那么这两种方法有什么区别吗?它们是否具有每 3 秒连续轮询服务器的相同效果?

另外,在成功回调函数中,如果满足某些条件,例如 data.length>1000,我如何终止这个无限轮询,那么我想终止这个循环并调用另一个函数?我应该做这样的事情:

function getData() {
        var tID = setTimeout( function() {
        $.ajax({
            url : 'http://example.com',
            type: 'GET',
            success : function(data) {
                //process data here
                if(data.length > 1000) { 
                   funcOutside();
                   clearTimeout(tID);
                }
            },
            dataType : 'json'
        }) }, 3000);
    }
4

3 回答 3

8

第二个选项不会每 3 秒轮询一次;它只会轮询一次。

要有条件地继续或停止轮询,您应该使用第一个选项的变体:在setTimeout调用周围添加条件。

function getData() {
    $.ajax({
        url : 'http://example.com',
        type: 'GET',
        success : function(data) {
            // depending on the data, either call setTimeout or simply don't
            if( /* data says continue polling */) {
                setTimeout(getData, 3000);
            }
        },
        dataType : 'json'
    });
}
于 2013-01-31T22:04:47.663 回答
3

那么这两种方法有什么区别吗?它们是否具有每 3 秒连续轮询服务器的相同效果?

是的,有一个重要的区别!第一个版本将在响应到达后对函数的调用进行排队。因此,调用之间的间隔将(大约)3000 毫秒加上请求/响应所花费的时间。

第二个版本将在 3 秒后发出请求,然后停止。如果您更改setTimeoutsetInterval,它将每 3 秒发出一个新请求,但不能保证在发出新请求时前一个请求已经完成(如果一个请求需要大约 3000 毫秒)。所以第一个版本可能就是你要找的。

关于终止循环:是的,只需添加一个条件,就像您在代码中的条件一样。但是不要清除超时,只是不要添加一个新的:

//process data here
if(data.length > 1000) { 
    funcOutside();
} else {
    setTimeout(getData, 3000);
}

最后一点:从技术上讲,这不是递归,因为它不是在getData调用自己,而是一直setTimeout调用的回调getData

于 2013-01-31T22:05:42.560 回答
0
(function loopsiloop(){
   setTimeout(function(){
   $.ajax({
       url: 'foo.htm',
       success: function( response ){
           // do something with the response

           loopsiloop(); // recurse
       },
       error: function(){
           // do some error handling.  you
           // should probably adjust the timeout
           // here.

           loopsiloop(); // recurse, if you'd like.
       }
   });
   }, 5000);
})();

这将为您完成工作。我在这里做三件事:

  1. 声明一个立即调用的函数 loopsiloop(注意末尾的括号)。
  2. 声明超时处理程序在 5 秒后触发。
  3. 在超时时间内轮询服务器,无论成功/失败都会调用 loopsiloop 并继续轮询。
于 2014-08-22T19:44:04.587 回答