4

失敗した ajax リクエストを特定の制限まで再試行する関数を作成する必要があります、次のように、再試行の最大数を超えた場合にのみプロミスが拒否されるようにする必要があります。

function my_ajax(...) { ... }

// then I use it this way
return $.when(my_ajax('foo.json'), my_ajax('bar.json'))

jQuery.when を使用するには、1 つの promise のみを返す必要がありmy_ajaxます。これは、内部の jQuery.ajax が解決されたときに解決され、最大の再試行が行われたときにのみ拒否されます。

私が作ったコードはこれです:

function do_ajax(args, dfd, attempt) {
    dfd     || (dfd = $.Deferred());
    attempt || (attempt = 1);

    $.ajax(args).then(dfd.resolve, function(xhr, text_status, error_thrown) {
        console.error(/* something useful */);
        attempt++;

        if(attempt > 3) {
            dfd.reject(xhr, text_status, error_thrown);
        } else {
            do_ajax(args, dfd, attempt);
        }
    });

    return dfd.promise();
}

// in some random code
return $.when(do_ajax({url:'foo.json'}), do_ajax({url:'bar.json'});

これは私にとってはうまくいきます*が、理解するのはちょっと難しいです。問題は、それを行うためのより良い(そして読みやすい)方法はありますか?

* - 実際、時々失敗することをテストしていませんが、最初の ajax リクエストが成功したときは問題なく動作します。

4

2 に答える 2

2

Mordhakの回答と SO dherman に関するその他のいくつかに基づいて、jQuery プラグインを作成しました: jquery.ajaxRetry ( GitHub repo ) とjohnkpaul : jquery.ajax-retryがあります。

jquery.ajaxRetry

$.ajax({
  // Retry this request up to 2 times
  shouldRetry: 2
});
  • 無期限に再試行できます
  • 再試行n回数
  • 関数を実行し、再試行を続ける必要があるかどうかを判断するためにtrue評価falseすることができますshouldRetry

jquery.ajax-再試行

$.ajax(options).retry({times:3, timeout:3000}).then(function(){
    alert("success!");
  }); 
  • 再試行n回数
  • 次の再試行までの待機時間を指定できます
  • 再試行するステータス コードを指定できます
于 2013-11-11T18:46:45.533 に答える