3

特定のページの読み込み時に、サーバーに ajax リクエストを送信して JSON データを取得するブラウザ アプリがあります。返されると、ajax リクエストが処理され、すべて問題ありません。

私が呼び出しているサーバーには現在、いくつかの厄介な断続的な問題があります。特に、ajax 呼び出しからの応答が JSON ではなく何も返さないことがランダムに発生しています。この特定のページの有用性は、この ajax 呼び出しから正しく返されるデータに依存しているため、場合によっては期待どおりに返されないという事実が、ユーザー (つまり私!) の問題を引き起こしています。

ここで、まったく同じ呼び出しをもう一度行うと、最初の呼び出しが間違った応答を返した直後に、サーバーは正しい応答を返します!

サーバーの問題には立ち入りたくありません。現在解決中ですが、いつ完了するかはわかりません。そのため、サーバーの問題が解決されている間、サーバーが間違った応答を返す時間を処理するために、何らかのキャッチを ajax 要求に入れ、すぐにまったく同じ呼び出しを再度行いたいと考えています。サーバーの問題が解決されるまで、これはユーザーの苦情を止めるための短期的な修正にすぎないことに注意してください。

私が現在持っているものはこれに似ています:

$.ajax({
  type: "GET",
  data: data,
  success: function(data, textStatus, jqXhr){

    // Do stuff...

  }
});

サーバーがぐらつきをスローすると、data未定義として戻ってきます。したがって、私が本当にやりたいことは、そうであるかどうかをテストしdataundefinedそうであれば、同じ ajax リクエストに対して同じ呼び出しを再度行うことです (私が行ったすべてのテストは、2 回目のラウンドで正しい応答が受信されることを示しています!)。

したがって、私には、これGotoは未定義のテスト内のステートメント (あえぎ、ショック、恐怖!!!) の良い使用例のように感じますが、JS でそれを実行できるかどうかさえわかりません。かなり悪い習慣と見なされます。

私はそれを回避する方法がいくつかあることを知っています。

  • 呼び出しをwhile(wasAjaxCallSuccessful){}ループ内に配置して、ajax リクエストを同期に設定し、not として戻ってきたwasAjaxCallSuccessful場合にのみ変数を true に設定できます。しかし、それは Goto ステートメントを使用するのと同じくらい気分が悪いです (それが許可されていれば)。dataundefined

  • data == undefined別のオプションは、テスト内で ajax リクエストへの呼び出しを繰り返すことです。しかし、繰り返しますが、それも間違っているように感じます。

それで、かなり珍しいシナリオではありますが、これを処理する最も適切な方法と考えられるのは何だろうと思いましたか?

4

2 に答える 2

2

@Sudhir の回答hereに基づいています。data以下のコードは、次の場合にajax 呼び出しを 3 回再試行しますundefined

$.ajax({
    url: "...",
    type: "GET",
    data: data,
    tryCount : 0,
    retryLimit : 3,
    success: function(data){

        if (typeof(data) == 'undefined') {
            this.tryCount++;
            if (this.tryCount <= this.retryLimit) {
                //try again
                $.ajax(this);
                return;
            }            
            return;
        }

    }
});

これは、サーバーが「動揺をスロー」したときに、成功関数がまだ起動されていることを前提としています。

于 2013-03-18T12:29:46.333 に答える
0

while(wasAjaxCallSuccessful){}ループ、ajaxリクエストを同期に設定

しかし、それは Goto ステートメントを使用するのと同じくらい気分が悪いです (それが許可されていれば)。

いいえ、同期 (A)jax が問題です。

別のオプションは、データ == 未定義のテスト内で ajax リクエストへの呼び出しを繰り返すことです。しかし、繰り返しますが、それも間違っているように感じます。

それがやり方です - 再帰関数のように:

function myAjax(data, callback, …) {
    var args = arguments;
    $.ajax({
        type: "GET",
        data: data,
        success: function(data, textStatus, jqXhr){
            if (data)
                callback(data); // Do stuff...
            else
                myAjax.apply(null, args); // try again
        },
        error: function() {
            myAjax.apply(null, args); // try again
        }
    });
}
于 2013-03-18T12:52:14.220 に答える