20

jquery ajaxメソッドを使用して大量のデータをWebサーバーに送信しており、クライアント側はサーバーからの確認を受信した後にのみ応答します.ajax呼び出しのMIDDLEでネットワーク接続が失われたと仮定して、この状況を検出する方法.

$.ajax({
         url:'server.php',
         data:'lots of data from 200KB to 5MB',
         type:'post',
         success: function(data)
                    {
                        alert('Success');
                      //some stuff on success

                    },
          error: function(XMLHttpRequest, textStatus, errorThrown)
                    {
                        alert('Failure');
                      //some stuff on failure
                    }
        });

これは私のコードであり、インターネットが切断された場合、ajax 呼び出しの途中でエラーは発生しません。

注 : データ サイズが 200kb から 5MB までさまざまであり、サーバーの応答時間の計算が実行できないため、タイムアウトを使用できません。

4

6 に答える 6

6

これを試して:

最初に、5 秒ごとに setInterval を使用して "ping" ajax 呼び出しを作成します。

function server_ping()
    {
        $.ajax({
            url:"url to ping",
            type: "POST"
        });
    }
    var validateSession = setInterval(server_ping, 5000);

次に、.ajaxError トラップを準備します。

$(document).ajaxError(function( event, request, settings ) {
        //When XHR Status code is 0 there is no connection with the server
        if (request.status == 0){ 
            alert("Communication with the server is lost!");
        } 

    });

Ajax 呼び出しはデフォルトで非同期であるため、ping がサーバーに送られ、要求がサーバーに到達できない場合、XHR ステータスの値は 0 であり、.ajaxError が発生し、エラーをキャッチして適切な方法で処理する必要があります。欲しい。

次に、データをサーバーに送信できます。データを送信するときに接続が失われた場合、ping によってエラーが報告されます。

于 2014-08-05T15:52:12.713 に答える
3

サーバーがそれほど混雑していない場合は、おそらくタイマーを使用して、データの転送を開始するときに定期的に接続の検出を開始できます (たとえば、5 秒ごとに別の ajax 呼び出しを使用して)。タイムアウトを使用できるようになりました。

ところで、1) タイムアウトは常にネットワーク エラーを意味するわけではありません。サーバーのダウンも「タイムアウト」を引き起こすことがあります

2) クライアント デバイスでドライバーがダウンしている場合、xhr.status = 0、タイムアウトなし

于 2014-01-12T02:39:19.107 に答える
2

私は同様の問題を抱えていて、単純なtry/catchと(たとえば)2秒の再試行遅延で解決しました:

function myAjaxMethod()
{
  try 
  {
    $.ajax({ ... });
  } catch (err) 
  { 
    console.log(err.message); 
    setTimeout(function(){myAjaxMethod(),2000});
  }
}
于 2016-06-16T10:14:46.323 に答える
0

$.ajax({}) の作成中に timeout: を追加してみてください。

また、必ず cache: false を設定してください。

Jquery の ajax() を参照してください: http://api.jquery.com/jQuery.ajax/#toptions

そこではさらに多くの情報が得られます!

あなたの問題についての私の考え[更新]

@RiteshChandora、ここであなたの懸念を理解しています。2つのことをするように提案できますか。

  1. 200kb から 5mb の範囲のデータを投稿しているため、最大タイムアウトを選択することをお勧めします。同じことをトリガーします。はい、これは問題になる可能性がありますが、選択した設計では、POST の進行状況を監視する唯一の方法はこのようにすることです。そうでない場合は、ポイント 2 を参照してください。

  2. フローを確認しました。FB からの応答 Json を自分の URL にコピーするようユーザーに求めています。ここにはいくつかの問題がありますが、

  3. json データにはユーザーに関する機密情報が含まれており、SSL 暗号化なしで URL に投稿しています。

  4. 取得したデータをサーバーに投稿するようにユーザーに促す必要があるのはなぜですか? ユーザーがサイドスクリプトをサーバーにすると、より簡単になるはずです。また、このような場合に、クライアントからサーバーに膨大なデータをポストするべきではありません。同じフォームを FB サーバー -> サーバー側のサーバーから取得できます。

私の提案する解決策: ユーザーが認証された後、サーバー側で友人リストを取得します。サーバー側で好きなことをして、結果をユーザー画面に表示します。

このようにして、サーバーがすべての負担を負います。また、ユーザーが URL に厄介な json 投稿を行う必要もありません。

ところで、あなたのアプリのアイデアはクールです。

于 2012-06-15T04:59:36.707 に答える
-5
   error: function(xhr, textStatus, thrownError)
                    {
                       alert(xhr.status);
                       alert(thrownError);
                       alert(textStatus);

                    }

試してみてください 。TextStatus (null 以外) は、"timeout"、"error"、"abort"、および "parsererror" です。HTTP エラーが発生すると、 throwError は「見つかりません」や「内部サーバー エラー」などの HTTP ステータスのテキスト部分を受け取ります。

インターネットが切断されると、応答が受信されず、最大でタイムアウト メッセージが表示されます。

于 2012-06-15T05:12:43.820 に答える