1

给定以下 jQuery 代码

function poll(){ 
    $.ajax({ url: /myurl, 
        success: function(data){ 
            //do stuff
        }, 
        dataType: "json", 
        complete: poll, 
        error: function(jqXHR, exception) {
            if (jqXHR.status === 0) {
                $("#ajax-msg").html("Not connect.\n Verify Network.");
            } else if (jqXHR.status == 404) {
                $("#ajax-msg").html("Requested page not found. [404]");
            } else if (jqXHR.status == 500) {
                $("#ajax-msg").html("Internal Server Error [500]");
            } else if (exception === 'parsererror') {
                $("#ajax-msg").html("Requested JSON parse failed.");
            } else if (exception === 'timeout') {
                $("#ajax-msg").html("Time out error.");
            } else if (exception === 'abort') {
                $("#ajax-msg").html("Ajax request aborted.");
            } else {
                $("#ajax-msg").html("Uncaught Error.\n" + jqXHR.responseText);
            }
            //wait for some interval and then try to poll again
         },
         timeout: 10000 
    });
}

在错误情况下,我希望在 1s、2s、4s、8s、16s、32s、1m、2m、4m、10m、20m、30m、40m 中再次调用 poll() 函数...

我读过使用睡眠是不正确的。我想知道“睡眠”、设置间隔或超时来完成此操作的正确方法。

4

3 回答 3

1

只需使用 setTimeout 并重新发送请求。

function poll() {
  var delay = 1000,
    failnum = 0;
  $.ajax({
    url: /myurl, 
        success: function(data){ 
            / / do stuff
  },
  dataType: "json",
  complete: poll,
  error: function (jqXHR, exception) {
    if (jqXHR.status === 0) {
      $("#ajax-msg").html("Not connect.\n Verify Network.");
    } else if (jqXHR.status == 404) {
      $("#ajax-msg").html("Requested page not found. [404]");
    } else if (jqXHR.status == 500) {
      $("#ajax-msg").html("Internal Server Error [500]");
    } else if (exception === 'parsererror') {
      $("#ajax-msg").html("Requested JSON parse failed.");
    } else if (exception === 'timeout') {
      $("#ajax-msg").html("Time out error.");
    } else if (exception === 'abort') {
      $("#ajax-msg").html("Ajax request aborted.");
    } else {
      $("#ajax-msg").html("Uncaught Error.\n" + jqXHR.responseText);
    }
    //wait for some interval and then try to poll again
    var opts = this;
    failnum++;
    setTimeout(function () {
      $.ajax(opts);
    }, failnum * delay * 2);
  },
  timeout: 10000
  });
}

您当然可以修改failnum * delay * 2以获得每次失败时所需的延迟。

于 2013-01-17T20:17:33.573 回答
0

延迟后的递归轮询调用将起作用:

function poll(delay){ 
   ...
        error: function(jqXHR, exception) {
            ...
            //wait for some interval and then try to poll again
            setTimeout(function() {
                poll(delay ? 2 * delay : 1000);
            }, 
            delay ? delay : 1000);
         },
         timeout: 10000 
    });
}

但这永远不会停止尝试,直到您关闭浏览器或计算机。但这就是你要求的。

于 2013-01-17T20:19:16.630 回答
0

我认为最简单的方法是使用相同的机制在成功和错误条件下继续轮询。

这样的事情应该这样做:

function poll(){
    clearTimeout(poll.data.timeout);
    $.ajax({ url: /myurl, 
        success: function(data){ 
            //do stuff
            poll.data.index = 0;
        }, 
        dataType: "json", 
        error: function(jqXHR, exception) {
            if (jqXHR.status === 0) {
                $("#ajax-msg").html("Not connect.\n Verify Network.");
            } else if (jqXHR.status == 404) {
                $("#ajax-msg").html("Requested page not found. [404]");
            } else if (jqXHR.status == 500) {
                $("#ajax-msg").html("Internal Server Error [500]");
            } else if (exception === 'parsererror') {
                $("#ajax-msg").html("Requested JSON parse failed.");
            } else if (exception === 'timeout') {
                $("#ajax-msg").html("Time out error.");
            } else if (exception === 'abort') {
                $("#ajax-msg").html("Ajax request aborted.");
            } else {
                $("#ajax-msg").html("Uncaught Error.\n" + jqXHR.responseText);
            }
            poll.data.index = Math.min(++poll.data.index, poll.data.delays.length-1);
        },
        complete: function( jqXHR, textStatus){
            //wait for some interval and then try to poll again
            poll.data.timeout = setTimeout(poll, poll.data.delays[poll.data.index] * 1000);
        },
        timeout: 10000 
    });
}
//And now a tidy place to keep the data for managing the poll.
poll.data = {
    delays: [0, 1, 2, 4, 8, 16, 32, 60, 120, 240, 600, 1200, 1800, 2400],//seconds
    index: 0,
    timeout
};
于 2013-01-17T20:31:14.567 回答