0

私のスクリプトはGETリクエストをページ(http://example.org/getlisting/)に送信しており、ページはJSONオブジェクトで応答します。({"success":true, "listingid":"123456"}

スニペットの例を次に示します。

var listingAjax = new XMLHttpRequest();
listingAjax.addEventListener("load", listingCallback, false);

function listingCallback(event) {
    if (this.readyState == 4 && this.status == 200) {
       console.log(this.responseText);
    }
}

listingAjax.open("GET", "http://example.org/getlisting/", true);
listingAjax.send();

十分に単純です。スクリプトも完璧に機能します!これを実行したいときに問題が発生します。

var listingAjax = new XMLHttpRequest();
listingAjax.addEventListener("load", listingCallback, false);

function listingCallback(event) {
    if (this.readyState == 4 && this.status == 200) {
       console.log(this.responseText);
    }
}

window.setInterval(function() {
    listingAjax.open("GET", "http://example.org/getlisting/", true);
    listingAjax.send();
}, 250);

私が想像するのは、私のスクリプトがサーバーに送信されるGET要求の安定したフローを作成し、サーバーがそれぞれに応答することです。次に、スクリプトはサーバーの応答を受信し、それらをコールバックに送信します。

もっと正確に言うと、このスクリプトを5秒間実行し、その間にスクリプトがサーバーに20個のGETリクエストを送信したとします。私のコールバック(listingCallback)も20回呼び出されると思います。

問題は、そうではないということです。サーバーから応答を受信する前に2つのGET要求を送信した場合、応答は無視または破棄されるようです。

私はこれから何を間違っている/誤解していますか?

4

2 に答える 2

2

多くのブラウザには、サーバーごとに開いているHTTP接続の最大数が組み込まれています。あなたはその壁にぶつかっているかもしれませんか?

これはMozillaの例ですが、ほとんどのブラウザには次のようなものが組み込まれているはずです:http: //kb.mozillazine.org/Network.http.max-connections-per-server

Chromeに関する以前の質問: GoogleChromeのサーバーあたりの最大接続数の制限を6以上に増やす

Windowsを使用している場合は、Fiddlerなどのツールを見てください。すべてのリクエストが実際に発行されているかどうか、またはブラウザが一部のリクエストをキューに入れているか、強制終了しているかを確認できる場合があります。

于 2012-12-31T03:43:39.607 に答える
1

XMLHttpRequest進行中の新しい接続で同じオブジェクトを再利用することはできませんopen。そうしないと、突然のabortイオンが発生します(Chromeでテスト済み)。XMLHttpRequest呼び出しごとに新しいオブジェクトを使用すると、次のことが解決されます。

function listingCallback(event) {
    if (this.readyState == 4 && this.status == 200) {
       console.log(this.responseText);
    }
}

window.setInterval(function() {
    var listingAjax = new XMLHttpRequest();
    listingAjax.addEventListener("load", listingCallback, false);
    listingAjax.open("GET", "http://example.org/getlisting/", true);
    listingAjax.send();
}, 250);

これは、間隔ごとに新しいajaxリクエストをキューに入れるとうまく機能します。

フィドル

呼び出しが多すぎると、各ブラウザーに固有の同時ajax呼び出しの上限が原因で速度が低下する可能性があることに注意してください。
ただし、最近のブラウザーにはかなり公平な制限と非常に優れた並列処理があります。小さなJSONオブジェクトだけをフェッチしている限り、最近のブラウザーはダイヤルアップを使用している場合でも追いつくことができるはずです。

前回ajaxポーリングスクリプトを作成したときは、ajax呼び出しを最小限に抑えるために、間隔を使用する代わりに、前のリクエストの成功ハンドラーで新しいリクエストを開始しました。ただし、このロジックがアプリに適用できるかどうかはわかりません。

于 2012-12-31T03:54:26.967 に答える