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 
    });
}

エラー状態では、poll() 関数を 1 秒、2 秒、4 秒、8 秒、16 秒、32 秒、1 分、2 分、4 分、10 分、20 分、30 分、40 分...

睡眠の使用​​は正しくないことを読みました。これを達成するために「スリープ」、間隔、またはタイムアウトを設定する適切な方法を知りたいです。

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 に答える