30

私はstackoverflowを検索しましたが、矛盾した答えを得ました:

XmlHttpRequest オブジェクトを再利用する必要があるのはなぜですか?

Ajax を多用するページ: 同じ XMLHttpRequest オブジェクトを再利用するか、毎回新しいオブジェクトを作成しますか?

また、w3schools.com にも推奨事項があります。

Web サイトに複数の AJAX タスクがある場合は、XMLHttpRequest オブジェクトを作成するための標準関数を 1 つ作成し、各 AJAX タスクに対してこれを呼び出す必要があります。

なぜこの推奨事項ですか?代わりに、ページでグローバルな XMLHttpRequest オブジェクトを使用して、すべての Ajax タスクを処理しています。

4

5 に答える 5

15

あなたは W3School の推奨事項を誤解しています。関連する部分を強調表示します。

Web サイトに複数の AJAX タスクがある場合は、XMLHttpRequest オブジェクトを作成するための標準関数を 1 つ作成し、各 AJAX タスクに対してこれを呼び出す必要があります。

1 つの AJAX 関数を使用してリクエストをフェッチすることが示されています。この関数は、IE と他のブラウザーとの間の不一致を処理します。XMLHttpRequest標準準拠のブラウザー、およびActiveXObjectIE で。

複数の XHR オブジェクトを使用することをお勧めします。1 つのグローバル xhr オブジェクトを使用すると、アプリケーションは一度に 1 つのリクエストしか処理できません。また、エラーが発生しやすくなります (たとえば、onreadystatechange 関数を開始せずに XMLHttpRequest を複数回起動するなど)。

W3schools は次のような意味です。

function createXHR() {
    try {
        return new XMLHttpRequest();
    } catch (e) {
        try {
            return new ActiveXObject("Microsoft.XMLHTTP");
        } catch (e) {
            return new ActiveXObject("Msxml2.XMLHTTP");
        }
    }
}
var xhr = createXHR();
xhr.open('get', '/test', true);
xhr.send();

などのリクエストを処理する関数を作成することをお勧めしますがjQuery.ajax

于 2012-07-16T10:25:54.653 に答える
8

作成する XHR ごとに異なるオブジェクトを使用することをお勧めします。方法があっても避ける!リクエストごとに新しいオブジェクトを作成しても問題ありません。メモリ リークなどの心配がある場合でも、心配する必要はありません。それらはすべて適切に GC されています。


Web サイトに複数の AJAX タスクがある場合は、XMLHttpRequest オブジェクトを作成するための標準関数を 1 つ作成し、各 AJAX タスクに対してこれを呼び出す必要があります。

実際には、新しいオブジェクトを作成し、呼び出すたびにそれを返す関数が 1 つあることを意味します。それは次のようなものです:

function newXHR(){
    return a new instance of XHR();
}
于 2012-07-16T10:25:25.900 に答える
2

あなたが強調している推奨事項は、特に 1 つの XMLHTTPRequest オブジェクトではなく、AJAX を処理する 1 つの FUNCTION を持つべきだということです。

質問ごとに異なるものを使用します。

これに対する一般的な議論は、XHR のセットアップに伴うオーバーヘッドに関するものです。ただし、これは AJAX を意図したとおりに (つまり、Web ソケットの面倒な代用としてではなく) 使用するサイトではほとんど無視できます。接続を開いたり、起動したり、リスナーをアタッチしたりする必要があります。

ブラウザは、特定の時間に許可される接続ゲートウェイの数に関してさまざまであるため、どの XHR が何を実行できるかを制御するのはブラウザ次第です。つまり、この側面の管理について心配する必要はありません。

最後に、XHR が削除可能 (変数ではなくオブジェクトのプロパティ) であれば、XHR を使用した後に手動で削除することを止めるものは何もありません。

于 2012-07-16T10:29:59.770 に答える
0

MDN Web ドキュメントから:

httpRequest 変数がグローバルに使用されている場合、makeRequest() を呼び出す競合する関数が互いに上書きされ、競合状態が発生する可能性があります。AJAX 関数を含むクロージャに対してローカルの httpRequest 変数を宣言すると、これを回避できます。

ソース: https://developer.mozilla.org/en-US/docs/Web/Guide/AJAX/Getting_Started

于 2020-01-20T06:12:27.513 に答える