web-dev-qa-db-ja.com

xmlHttpRequest .open()メソッドのパラメーター「true」

MDNで読んだ参考文献から、

TRUE(デフォルト)の場合、サーバーの応答がまだ到着していない間、JavaScript関数の実行が継続されます。

これはAJAXのAです。

私はAJAXを使用していましたが、それを読んだときに少し混乱しました。問題は、AJAXの概念を明確に理解していないことかもしれません。もちろん、AJAXはページを更新しないので、サーバーへの接続と応答は完全にバックグラウンドで行われます。

しかし、その参考文献によると、私が想像できるのは、JavaScriptに次のようなコードがある場合です。

//true, therefore process the function while server retrieves url
var xmlResponse;
var url = "http://example.com/file.xml";
xml_req.open("GET", url, true); 

xml_req.onreadystatechange = function() {
     if(xml_req.readyState == 4 && xml_req.status == 200) {
        if(xml_req.responseText != null)
             xmlResponse = xml_req.responseXML; //server response may not yet arrive
        else {
             alert("failed");
             return false;
        }
     };
xml_req.send(null);

サーバーがまだデータを取得しているという意味で、xmlResponseが未定義になる可能性があるという意味ではありませんか? AJAXテクノロジーの実行フローが実際に何であるかを誰かが説明できますか?前もって感謝します。

26
Benny Tjia

私はより詳細な記事を書きました here ですが、これは基本的な考え方です。

Trueに設定すると、非同期リクエストを作成することになります。つまり、http要求が完了するまでコードは一時停止しません。同期呼び出しはブラウザをロックアップするため、他には何も実行されません。それは問題を引き起こす可能性があるため、人々は非同期を好みます。

XHRオブジェクトは、何をしているかを更新します。 onreadystatechangeイベントで更新を提供します。関数を登録して、そのステータスを追跡できるようにします。 onreadystatechangeは4回呼び出されます。状態が異なるそれぞれ

0 = uninitialized
1 = loading
2 = loaded
3 = interactive
4 = complete

Readystateが4の場合、データは利用可能です。

投稿したコードでは、完全な状態を確認しており、ステータスが200 [ok]であることを確認しています

if(xml_req.readyState == 4 && xml_req.status == 200){

XmlResponseの値は、返される前にコード内のどこかで使用しようとすると未定義になります。例

ml_req.send(null);
alert(xmlResponse );

XMLHttpRequestの記事の最初の記事の1つは、あなたにとって良い読み物かもしれません。 xmlhttpreqのApple記事

23
epascarello

理解しておくべき重要なことは、onreadystatechangeハンドラーがすぐに実行されないことです。そして、それは複数回実行されます。断片を個々の機能に分解すると、概念化が容易になる場合があります。

function makeRequest(url)
{
    var xhr = new XMLHttpRequest();
    xhr.open("GET", url, true);
    xhr.onreadystatechange = receiveResponse;
    xhr.send();
}
function receiveResponse(e)
{
    if (this.readyState == 4)
    {
        // xhr.readyState == 4, so we've received the complete server response
        if (this.status == 200)
        {
            // xhr.status == 200, so the response is good
            var response = this.responseXML;
            ...
        }
    }
}

最初に、makeRequestが呼び出されてから終了します。その後、サーバーから何かが返されるとすぐに、receiveResponseが呼び出されます。毎回、応答が完全に受信されたかどうかを確認し、その応答を処理し続けます。

4
gilly3