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テクノロジーの実行フローが実際に何であるかを誰かが説明できますか?前もって感謝します。
私はより詳細な記事を書きました 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記事
理解しておくべき重要なことは、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
が呼び出されます。毎回、応答が完全に受信されたかどうかを確認し、その応答を処理し続けます。