Open Source Web Development Tutorials - Dev Shed
これで安心!Ajaxのエラーへの対処方法
(2009/03/12公開)
Ajaxリクエストのスレッドの効果
Ajaxリクエストは、JavaScriptのスレッドと同じように動作します。リクエストの実行中、コードのフローに含まれる、Ajaxリクエストステートメント以後に存在するJavaScriptコードの実行は継続されます。Ajaxリクエストの以後にあるステートメントで、Ajaxリクエストの結果(ダウンロードされたテキスト)を使いたい場合があります。問題は、いつリクエストが完了する(いつテキストが完全にダウンロードされる)のかを知る方法がないことです。リクエストが完了してしまった時点では、リクエストステートメント以後のステートメントは(ダウンロードされたテキストを使えずに)実行を完了しているでしょう。
AjaxテキストのonreadystatechangeメソッドでAjaxの結果(ダウンロードされたテキスト)を使うのが可能であれば、そうするのが適切です。これが、競合を回避する最善の方法です。
Ajaxリクエスト以後のステートメントでAjaxの結果をどうしても使う必要がある場合は、Ajaxリクエストの後にwhileループを作り、テキストがダウンロードされたかどうかをチェックします。ダウンロードされたことを確認してからループを終了して、次の処理に移るようにしてください。xmlHttp.onreadystatechangeメソッドに、リクエストの結果を受信したことをこのwhileループに対して通知するステートメントを組み込みます。
応答に予測より長い時間がかかる
応答に予測より長い時間がかかる場合、以下の方法で処理します。この方法では、Ajaxリクエストの処理に時間がかかりすぎる場合、リクエストをアボートします。ただし、どれだけの時間が経過したらアボートすべきかを決定する必要があります。
Ajaxオブジェクトには、abort()というメソッドが含まれています。この関数は、Ajaxリクエストをアボートするために使います。リクエストがアボートされると、readyStateプロパティは0にリセットされ、何もダウンロードされません。このため、readyStateやstatusプロパティのことを気にする必要はありません。次のコードセグメントは、Ajaxプロシージャ以後に置かれ、5秒後にAjaxリクエストをアボートします。
function abortAjax()
{
xmlHttp.abort();
}
setTimeout("abortAjax()", 5000);
結論
この記事の最初に示した質問に対して、明確な回答を示すことはできません。リロードボタンをクリックすれば、目的の情報が得られる状況もあります。また、その方法が使えない状況もあります。readyStateおよびstatusプロパティは常に使用できます。これによって、多くの問題を解決できるでしょう。Ajaxリクエストのスレッドへの影響を忘れないようにしてください。競合を避ける方法については、最後のセクションで述べたとおりです。
Copyright © 2008 Ziff Davis Enterprise, Inc.
Originally appearing in the U.S. Edition of Dev Shed. All Rights Reserved.








