TEDIA会員に登録したメールアドレスとパスワードを入力してください

メールアドレス:

     パスワード:


パスワードを忘れた方はパスワードの確認を行ってください。

TEDIA会員へのご登録がお済みで無い方はこちらで登録ができます


>> テクノロジーポータル TEDIA トップページへ戻る <<

Think IT Software Developer's Think IT Find-IT 失敗しないソフト選び Find-IT TEDIA テクノロジーポータル TEDIA インストールマニアックス2008 インストールマニアックス2008

TEDIA SponsorsOpen 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リクエストのスレッドへの影響を忘れないようにしてください。競合を避ける方法については、最後のセクションで述べたとおりです。

(著者:Chrysanthus Forcha)

原文へのリンク


前のページ     1    2    3    4   

Copyright © 2008 Ziff Davis Enterprise, Inc.
Originally appearing in the U.S. Edition of Dev Shed. All Rights Reserved.