2011-08-16 12 views
0

長時間実行されているXMLHttpRequestが実際にサーバーに接続されたことを検出しようとしています。XMLHttpRequestが接続されたときに検出

readystatechangeイベントをリッスンすると、要求が完了したときにのみ起動されます。私のテストサーバーはヘッダーといくつかのデータを送信し、長いタイムアウト(10秒)後に要求を終了します。 XHRは、最後のイベントのみを起動し、次の各状態をバックツーバックで処理します。HEADERS_RECEIVED、LOADING、DONE。ここで

は私のブラウザのコードです:

var xhr = new XMLHttpRequest(); 
xhr.open('GET', url, true); 
xhr.onreadystatechange = function(evt) { 
    console.log('Request is now in state ' + xhr.readyState); 

    if(xhr.readyState === xhr.HEADERS_RECEIVED) { 
     console.log('Request has started'); 
    } 
    if(xhr.readyState === xhr.DONE) { 
     console.log('Request is finished'); 
    } 
}; 
xhr.send(null); 

ヘッダが実際に受信されているとき、どのように私は検出することができますか?私は、APIで利用できるものに基づいてリクエストが開始されたときに検出できないと仮定しています。これまでのところ、私は次のように作ってみた

:要求は、例えば開いたとき

  • を投稿する

    • Set要求メソッドは、いくつかのデータを送信しますxhr.send('something')
    • このようxhr.upload.onloadコールバック

    のために聞く:

    xhr.upload.onload = function(evt) { 
        console.warn('Request has started'); 
    }; 
    

    しかし、FirefoxとSafariでのみ有効です。 ChromeやIEではありません。

  • +0

    なぜそれが長くかかるのか分かりませんか?あなたが待っているデータがもうない場合は、〜10秒の操作を別のページに移動することができますので、できるだけ早くXHRを終了してください。 – sdleihssirhc

    +0

    私は意図的にそれを延期しています。これは、多くのXHRを使用するアプリケーションのテストで、起動または完了したタイミングを検出する必要があります。 – robbles

    答えて

    2

    XMLHttpRequestオブジェクトが5 readystates

    • 0 =初期化されていない
    • 1 =ローディング
    • 2 =あなたは
    • 3 =インタラクティブ
    • 4 =完全

    ロードを有しますあなたのコードで2つをチェックしているだけです。また効率のためにelse ifを使用する必要があります。

    +0

    または最大限の効率を得るためのスイッチ – Joe

    +0

    ありがとうございますが、それは問題のポイントではありません。私は最初にすべてのコールバックをロギングしようとしましたが、前述したように、要求が完了した時点ではなく、readystates 2,3,4に対してコールバックが呼び出されます。 – robbles

    関連する問題