• ベストアンサー

javascriptで排他制御

いつもお世話になっております。 現在、AJAXを使って、10秒に一度サーバのデータを受けて表示するというものを作成しています。 その際、キープアライブという形で別の通信をしているのですが、運悪くその二つの応答が重なってしまうと、データ表示がおかしくなってしまいます。 これではまずいので、一つの通信が終わるまでもう一つの通信を始める時間になっても待っているようにする、排他制御がしたいのですが、javascriptで実現可能なのでしょうか? C++でいうとcriticalsectionのようなものがほしいですが見当たらなかったので、ご存知の方がおられましたらご教授願います。

質問者が選んだベストアンサー

  • ベストアンサー
  • OKbokuzyo
  • ベストアンサー率43% (130/296)
回答No.1

AJAXの通信方法は通常のWeb(すなわちhttp等)となんら変わりありませんから 排他制御はサーバ側で行う必要があります。 というより、JavaScriptはクライアントで動きますから サーバで起きていることをクライアント(しかもブラウザ)で制御するというのは おかしな話ではないですか? HTTPステータスコードならstatusプロパティで取得することが可能なので おかしなデータが送られてくるときに何か特別なステータスコードが返っているなら 処理を変えることができるかもしれません。

その他の回答 (1)

回答No.2

> これではまずいので、一つの通信が終わるまでもう一つの通信を始める時間になっても待っているようにする、排他制御がしたいのですが、javascriptで実現可能なのでしょうか? 以前の通信の状態を確認して、通信中であればリクエストしないか、 abort()を呼び出して通信を停止すればいいのでは? 通常のブラウザは、アンカー2つをクリックすると、1つめのは停止して2つめのアンカーのページに移動しますから、 古いのはabort()して新しいリクエストだけを実行、というのがユーザーの期待に添う動作ではないかと思います。 abort()を呼び出すとreadystateが1~3から0に変化しますので、onreadystatechangeが呼び出されます。 そのときにreadyStateプロパティかstatusプロパティを確認すると、Fxなど一部のブラウザでシステムエラーが発生しますので、何か対策が必要です。 私は別途通信中を確認するためのフラグを持たせることで対応しました。 (readyState、statusと、独自の変数の3つで確認し、onreadystatechangeの処理を行っています) ActiveXObjectはabort()をサポートしていませんが、 deleteやnullの代入でオブジェクトを削除すれば、通信を停止できます。

関連するQ&A