- ベストアンサー
JavaScriptとサーバーでのやり取り
- サーバー側で常にアップデートされているデータにAJAXを使ってアクセスし、そのデータに基づいてブラウザ画面に直線を引くルーチンを作成しています。
- サーバー側ではデジタル回路の任意の8ポイントからのデータを1バイトにまとめてファイルを作り、数ミリ秒ごとに新しいデータに書き換えています。
- ブラウザ側では、サーバーで常に更新されているデータファイルに記録されているデータをAJAXで取得し、添付した写真(1)のように、横に10分割、縦に8分割してあるキャンバスの各コマにそのデジタル信号を時系列的に左から右へ流れるように表示できるようにしています。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
時間稼ぎを for 文のループではなく setTimeout に変えたらどうでしょう。 for文で回っている間は他の処理の割り込みが発生せず、ひたすらfor文の処理が動いてしまい時間稼ぎになっていない場合があります。 alertで上手く行くのは、ブラウザにalertが表示されて「OK」が押されるのを待っている間は、その部分の処理が止まり、他の処理が割り込める状態となっているためAjax側の処理が実行されていきます。 setTimeoutを使えば、指定した時間の間メインの処理が止まって、待ちになっていた他の処理が実行されるので、alertが表示されユーザーが「OK」を押すのを待っているのと同じような状態にすることができます。
その他の回答 (2)
- b0a0a
- ベストアンサー率49% (156/313)
forで回すのはおかしいですね
お礼
早速のご回答、有難うございます。 for ループを使わない方法を今試しています。
直接の回答になっていなくて恐縮なのですが……。 どうも、見たところ、サーバーと常時接続を維持して表示を更新させていくようなことを考えているように思えるのですが……。Ajaxは、非同期にサーバーにアクセスして結果を受け取る、それだけのものです。常時接続を維持してデータを受信し続けるようなものではありません。そこに設計上の問題がありはしないでしょうか。 そうした処理は、Server-Sent Eventなどのほうが向いているように思えました。本格的に常時接続による双方向通信を行うのであればWeb Socketという技術がありますが、専用のサーバーが必要などちょっと敷居が高いです。このあたり調べてみてはいかがでしょう。 参考ページ http://libro.tuyano.com/index3?id=872003
お礼
早速回答いただき、有難うございます。 これは学校のプロジェクトでやっているもので、本格的なシステムを作ろうとしているわけではありません。Ajaxが非同期なのは知ってますが、ほかのルーチンでも同じような形で常時アクセスして正弦波を再生したり、FFTを使って周波数スペクトルを表示できたりしています。サーバー側のデータさえ用意できていればいつでも(時々でも常時でも)アクセスできると思ってやっています。
お礼
早速ご回答いただき、有難うございます。 外側の for ループを外して、内側全体を関数にしてこのルーチンの外側に置き、外側のfor ループがあった場所に setTimeout( ) をおいて、一定期間ごとにこの関数を呼ぶ形にしてやってみます。