• 締切済み

一定時間処理待ちするコード

1つのファンクションの中で3つのまとまりの処理を行っています。 便宜上処理A,処理B,処理Cとします。 A処理は普通に処理します。 B処理では部分的に処理待ちを行いたい。 C処理は、B処理が終わってから処理を行いたい。 現在は、B処理のメソッドの中でsetTimeoutを使用して処理待ちを行っています。が、言うまでもないことですが、このままではB処理を待たずにC処理を行ってしまいます。 それではと、C処理のグループをファンクションにしてしまい、そのファンクションの呼び出しをB処理の待ち時間と同じかそれより少し長く待つようにすれば実現すると思うのですが、あまりにも美しくないと思っています。 純粋に処理を待つという処理をしたいと思っています。 昔はfor文でぶん回すという方法もありましたがCPUを使いすぎるのでやりたくありません。 何かうまい方法はありませんでしょうか。 よろしくお願いします。

みんなの回答

回答No.7

「一定時間処理を中断する方法」は、sleep(n)さえあればそれで解決なんでしょうけど、あいにくjavascriptには無いので、setTimeout()で実現させるわけです。 その実装例は#1さんが早くに提示されているのに『何故まだ問答が続くんだろう?』と思ってしまいます。 で、setTimeout()代用策で妥協できないとしたら、その理由は一つ。 「待っている間、他のイベント処理を実行させたくない」 ということですね。 この大切な要件を質問者さんが書かないから、話が堂々巡りになっているのではないですか? もしそうだとしての回答は、setTimeout()を待つ間は、 document.body.style.cursor = "wait"; document.body.disabled = true; で画面を無効化すると良いのでは。

arakororin
質問者

補足

ちょっと今回の具体例を前提にすると誤解を生じさせそうなので、「一定時間処理を中断する方法は?」という質問に変更させていただきたいと思います。よろしくお願いします。

すると、全ての回答が全文表示されます。
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.6

考え方次第だと思いますが、フローから考えれば 単純に作業Bに作業Cをつなげるだけなので、 前後関係があるものはすべてfunctionを介して ひとくくりの作業だと考えればすみますよね? <script language="javascript"> alert("作業A") tid=setTimeout("x()",1000) function x(){ alert("作業B") alert("作業C") } </script>

arakororin
質問者

補足

ちょっと今回の具体例を前提にすると誤解を生じさせそうなので、「一定時間処理を中断する方法は?」という質問に変更させていただきたいと思います。よろしくお願いします。

すると、全ての回答が全文表示されます。
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.5

>wait関数を作りたいということです。 javascriptだけでは、(時間が過ぎるまで空ループする以外では)ムリだと思います。 javaのクラスで、wait()関数を作って、それを呼び出すことはできるかもしれません。 IEに限っていえば、WSHを使えばできると思います。

arakororin
質問者

お礼

了解しました。ありがとうございました。 何でないんですかね。 でもほしいという人が多いようなので将来のバージョンアップで追加されるかもしれませんね。 ありがとうございました。

すると、全ての回答が全文表示されます。
  • steel_gray
  • ベストアンサー率66% (1052/1578)
回答No.4

何度もすいません。ようやく意図がはっきり理解できましたので。 で、Javascriptではご存知のようにwaitやsleepに相当するものはないし、手軽に使えるwaitを作り出す事も不可能なようです。 「javascript wait関数」で検索してみるみなさんの苦労の跡がうかがえますが、結局はBLUEPIXYさんの回答のように書き方の工夫でなんとかしているようです。

すると、全ての回答が全文表示されます。
  • steel_gray
  • ベストアンサー率66% (1052/1578)
回答No.3

なんか中途半端な回答が続いてすいませんが。 A処理、B処理の結果を見るには一度Javascriptパーサから開放される必要がありますので、別関数化してタイマー系のメソッドで再度呼び出すとかイベントの発生で呼び出される必要があると思います。

すると、全ての回答が全文表示されます。
  • steel_gray
  • ベストアンサー率66% (1052/1578)
回答No.2

Cを別の関数(function)にしてBの終了時にCを呼び出せばいいように思えたんですが違うんでしょうか? また、「処理待ち」とは具体的に何を待っているのでしょうか?

arakororin
質問者

補足

>また、「処理待ち」とは具体的に何を待っているのでしょうか? 処理を一定時間中断することです。 setTimeoutは正確には一定時間後に指定処理を行うだけであり、処理自体の中断はしませんよね。 すなわち、B処理の中でsetTimeoutを行ってもその処理が終了する前にC処理が走ってしまうのです。 ちょっと今回の具体例を前提にすると誤解を生じさせそうなので、「一定時間処理を中断する方法は?」という質問に変更させていただきたいと思います。よろしくお願いします。

すると、全ての回答が全文表示されます。
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

var TimeoutID; var stat=0; function ABCfunc(){ switch(stat){ case 0: //A処理 //B処理の途中まで stat=1; TimeoutID=setTimeout('ABCfunc()',10000);//10秒待つ break; case 1: clearTimeout(TimeoutID);//Timeout解除 //B処理再開 //C処理 stat=0; break; } } ---------------------------------------------------------------- 試してませんが、上記みたいな感じでできるかと思います。

arakororin
質問者

補足

いろいろ書きすぎて、かつ希望が不明確でした。すみません。 質問と希望は >純粋に処理を待つという処理をしたい という一言に尽きます。 wait関数を作りたいということです。 こんな感じかなーと思って作ってみました。 が、現在無限ループ中です… function wait(w) { // 読み込み待ち t = 0; while(t < w) { setTimeout("t = t + 100", 100); } }

すると、全ての回答が全文表示されます。

関連するQ&A