web-dev-qa-db-ja.com

Ajaxリクエスト後、ブラウザはどのくらい待機しますか?

サーバーがリクエストに応答する前に、エラーが表示されるまでブラウザはどのくらい待つことができますか?この時間は無制限ですか?

62
Taras Lukavyi

JQuery $ .ajax呼び出しを使用している場合、タイムアウトプロパティを設定して、リクエストがタイムアウトステータスで返されるまでの時間を制御できます。タイムアウトはミリ秒単位で設定されるため、非常に高い値に設定するだけです。 「無制限」に0に設定することもできますが、私の意見では、代わりに高い値を設定する必要があります。

注:無制限は 実際はデフォルト ですが、ほとんどのブラウザーにはヒットするデフォルトのタイムアウトがあります。

タイムアウトによりajax呼び出しが返されると、必要に応じて別のケースで処理できる「タイムアウト」のエラーステータスで返されます。

したがって、タイムアウトを3秒に設定し、タイムアウトを処理する場合の例を次に示します。

$.ajax({
    url: "/your_ajax_method/",
    type: "GET",
    dataType: "json",
    timeout: 3000, //Set your timeout value in milliseconds or 0 for unlimited
    success: function(response) { alert(response); },
    error: function(jqXHR, textStatus, errorThrown) {
        if(textStatus==="timeout") {  
            alert("Call has timed out"); //Handle the timeout
        } else {
            alert("Another error was returned"); //Handle other error type
        }
    }
});​
73
Tj Kellie

はいといいえ。はい、サーバーはそれを行うことができるか、そうするように構成できます。ブラウザー(バージョン/ディストリビューターの詳細についてはわかりません)でタイムアウトを有効にすることはできません。

ただし、HTTP経由でこれを達成/エミュレートするには2つのソリューションがあります。

  • これが長時間実行される単純なスクリプトであり、結果を待っている場合、これは進むべき道ではありません。代わりに前述のポスターのように実行し、結果のサーバーポーリングで非同期処理を使用する必要があります。 。たとえば、画像プロセッササーバー側からのサムネイルスクリプト:ユーザーが画像をアップロードすると、サーバーはすぐに200と「ジョブID」を返します。クライアント(javascript ^^)は、JobIDを使用してジョブのステータス/結果を要求できます。
  • ブラウザーとサーバー間のリアルタイム接続(1方向接続、ブラウザーによって要求が行われると、新しい要求(ajax ^^)を使用せずにそれ以上の情報を送信できなくなる)のような目標にする場合、これはロングポーリングと呼ばれます/ reverseajax。httpを介したリアルタイム通信に使用できます。 2つの長いポーリングされた要求を並行して使用するいくつかの手法があり、それらの1つがタイムアウトすると、2番目の要求がアクティブになり、最初の要求が再接続を試行します。
14
smassey

あなたが達成しようとしていることについてもう少し説明できますか?サーバーで長時間実行されているプロセスがありますか、ローカルマシンだけで設定を変更したいですか、それとも大量に管理する方法ですか?ユーザーの?

ブラウザが待機する時間は、いくつかの要因に依存します。タイムアウトが発生する場所-TCPレベル、サーバーまたはローカルブラウザーのどちらですか?

サーバー上で長時間実行されているプロセスがあり、後でWebページを更新する場合、それを処理する一般的な方法は、長いプロセスを非同期で実行し、完了したときにクライアントに通知することです。サーバーをポーリングするajax呼び出しを行うか、HTTP 1.1を使用してクライアントに通知ストリームを提供します。

どちらの場合でも、接続を閉じることはまだ可能であるため、クライアントは再び接続を開く必要があります。

3
Andy Davies

通常の(HTMLページ)リクエストの場合、ブラウザーはccaの後にタイムアウトになります。 30秒他の参加者がおそらくそれに続くので、それは重要です:プロキシ、ルーター(ルーターはこのゲームでプレイしますか?私にはわかりません)。私は4秒長いサーバー側の遅延(クライアントに送信するものがない場合)を使用しています。そして、私のAJAXクライアントはすぐに別のHTTP要求を実行します(私はローカルネットワーク、インターネットラグはありません)4秒は、頻繁なポーリングでサーバーとネットワークを過負荷にしないために十分な長さであり、何らかの理由でクライアントが検出できない行から1つのポーリングが落ちる場合に十分に短いですそしてハンドル。

また、コメットには別の問題(長いHTTPリクエスト)があります:同時HTTPリクエストの数に対するブラウザの制限、クライアント側イベントの処理(すぐにサーバーに送信する必要があります)、サーバー/ネットワークダウンの検出と回復、マルチユーザー処理等.

2
ern0