プロが教える店舗&オフィスのセキュリティ対策術

1つのファンクションの中で3つのまとまりの処理を行っています。

便宜上処理A,処理B,処理Cとします。
A処理は普通に処理します。
B処理では部分的に処理待ちを行いたい。
C処理は、B処理が終わってから処理を行いたい。


現在は、B処理のメソッドの中でsetTimeoutを使用して処理待ちを行っています。が、言うまでもないことですが、このままではB処理を待たずにC処理を行ってしまいます。

それではと、C処理のグループをファンクションにしてしまい、そのファンクションの呼び出しをB処理の待ち時間と同じかそれより少し長く待つようにすれば実現すると思うのですが、あまりにも美しくないと思っています。

純粋に処理を待つという処理をしたいと思っています。
昔はfor文でぶん回すという方法もありましたがCPUを使いすぎるのでやりたくありません。

何かうまい方法はありませんでしょうか。
よろしくお願いします。

A 回答 (7件)

>wait関数を作りたいということです。


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

了解しました。ありがとうございました。

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

ありがとうございました。

お礼日時:2006/01/22 20:55

「一定時間処理を中断する方法」は、sleep(n)さえあればそれで解決なんでしょうけど、あいにくjavascriptには無いので、setTimeout()で実現させるわけです。


その実装例は#1さんが早くに提示されているのに『何故まだ問答が続くんだろう?』と思ってしまいます。

で、setTimeout()代用策で妥協できないとしたら、その理由は一つ。

「待っている間、他のイベント処理を実行させたくない」

ということですね。
この大切な要件を質問者さんが書かないから、話が堂々巡りになっているのではないですか?

もしそうだとしての回答は、setTimeout()を待つ間は、

document.body.style.cursor = "wait";
document.body.disabled = true;

で画面を無効化すると良いのでは。

この回答への補足

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

補足日時:2006/01/22 20:52
    • good
    • 0

考え方次第だと思いますが、フローから考えれば


単純に作業Bに作業Cをつなげるだけなので、
前後関係があるものはすべてfunctionを介して
ひとくくりの作業だと考えればすみますよね?


<script language="javascript">
alert("作業A")
tid=setTimeout("x()",1000)
function x(){
alert("作業B")
alert("作業C")
}
</script>

この回答への補足

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

補足日時:2006/01/22 17:53
    • good
    • 0

何度もすいません。

ようやく意図がはっきり理解できましたので。

で、Javascriptではご存知のようにwaitやsleepに相当するものはないし、手軽に使えるwaitを作り出す事も不可能なようです。

「javascript wait関数」で検索してみるみなさんの苦労の跡がうかがえますが、結局はBLUEPIXYさんの回答のように書き方の工夫でなんとかしているようです。
    • good
    • 0

なんか中途半端な回答が続いてすいませんが。



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

Cを別の関数(function)にしてBの終了時にCを呼び出せばいいように思えたんですが違うんでしょうか?



また、「処理待ち」とは具体的に何を待っているのでしょうか?

この回答への補足

>また、「処理待ち」とは具体的に何を待っているのでしょうか?

処理を一定時間中断することです。

setTimeoutは正確には一定時間後に指定処理を行うだけであり、処理自体の中断はしませんよね。

すなわち、B処理の中でsetTimeoutを行ってもその処理が終了する前にC処理が走ってしまうのです。


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

補足日時:2006/01/22 14:14
    • good
    • 0

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;
}
}
----------------------------------------------------------------
試してませんが、上記みたいな感じでできるかと思います。

この回答への補足

いろいろ書きすぎて、かつ希望が不明確でした。すみません。

質問と希望は
>純粋に処理を待つという処理をしたい
という一言に尽きます。

wait関数を作りたいということです。
こんな感じかなーと思って作ってみました。
が、現在無限ループ中です…


function wait(w) {
// 読み込み待ち
t = 0;
while(t < w) {
setTimeout("t = t + 100", 100);
}
}

補足日時:2006/01/22 12:22
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!