• 締切済み

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

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

  • 一定時間後にsetIntervalでループ処理を行うにはどうしたらいい

    一定時間後にsetIntervalでループ処理を行うにはどうしたらいいのでしょうか。 JavaScriptにwait関数があれば早いのですが、setTimeout()のなかに入れ込むしか思いつきません。 forやwhile等で空ループさせて終了後に実行という方法も考えましたが、CPUに余計な負荷がかかるみたいでこれは避けたいです。 具体的には次のようなことがしたいと思っています。 function(a,b,c){ setTimeout(function(){ setInterval(function(){} ,10 ) },c) しかしこれだと再下段の関数が実行されないようです。またループ処理は可能な限りsetInterval()にさせたいと思っています。クロージャで解決できるんでしょうか。何か良い方法がありましたらお願いします。

  • setTimeoutのthis参照について

    prototypeメソッドの中でsetTimeout関数を使用したところ、thisで自身の関数を参照しなくなりました。setTimeoutの挙動についてぐぐってみたのですが、いまいちsetTimeoutを使用したときのスムーズな記述方法がわかりません。 ******************************** var hoge=function(){ this.myName="ほげ"; } hoge.prototype={ init:function(){ setTimeout(function(){ hoge.prototype.displayName(); // ★(1)setTimeout関数の中でのメソッドの適した呼び出し方は? // ↑の記述でも呼び出せるけど、間違ってる気がする。。 },1000) }, displayName:function(){ // ★(2)ここでhogeオブジェクトのmyNameプロパティを参照するにはどう記述すれば良いのか? //console.log(this.myName); //↑setTimeoutを使ったのでthis参照はwindowオブジェクトになっているから違う //console.log(hoge.myName); →undefinedを返す } } window.onload=function(){ var a=new hoge(); a.init(); } ******************************** 上記のようなprototype関数を使用したときのスムーズな記述方法を教えていただけませんでしょうか。 知りたいのは下記2点です。 ★(1)prototypeメソッドを使用したとき、setTimeout関数の中でのメソッドの適した呼び出し方は? ★(2)setTimeout関数内で呼び出したメソッドから、自身のオブジェクトのプロパティを参照するにはどう記述すれば良いのか? 初心者なので説明が下手だったり、質問内容で間違った記述があるかもしれません。 質問内容で問題がありましたらご指摘いただけると助かります。

  • 各々の関数を処理するごとに変数aに1を足したい

    各々の関数を処理するごとに変数aに1(実際には関数ごとに異なる数)を足したいと考えています。 (関数Aの処理を行った場合には変数aに1を足し(0+1=1)、加えて関数Bの処理を行った場合には変数aにさらに1を足して(1+1=2)、加えて関数Cの処理を行った場合には変数aにさらに1を足して(2+1=3)・・・・) perlでは以下のような記述で実現できるかと思いますが、JAVAスクリプトではどのように記述すればよいのでしょうか。色々と参照しながら試行錯誤したのですが、うまく動作しませんでした。恐らくは基本的な質問かとも思われ大変恐縮ですが、特にJAVAスクリプトに関しては全くの初心者の為、何卒ご教授いただけないでしょうか。申し訳ありませんが、よろしくお願いいたします。 $a = 1; sub A{$a = $a+1;} sub B{$a = $a+1;} sub C{$a = $a+1;} &A; &B; &C; print "$a"; ############################################# ちなみに、本などを見ながらreturnや引数を利用するのかと試行錯誤したのですが、具体的な記述方法が分からず、失敗しました。 a=1; function A() {a = a+1;} function B() {a = a+1;} function C() {a = a+1;} function A(); function B(); function C(); document.write(a);

  • 一定時間がきたら表示を消したい

    window.statusを使用して、一定時間がきたら表示を消すように記述するにはどうすればよろしいでしょうか? 以下にソースを記述しています。どなたか教えてください。 <head> <script language="javascript"> <!-- function a() { window.status=new Date().getHours()+"時"+new Date().getMinutes()+"分"+new Date().getSeconds()+"秒"; b=setTimeout("a()",500); } //--> </script> </head> <body onLoad="a()"> </body>

  • 一定時間がきたら表示を消すようにしたい

    window.statusを使用して、一定時間がきたら表示を消すように記述するにはどうすればよろしいでしょうか? 以下にソースを記述しています。どなたか修正してください。 <head> <script language="javascript"> <!-- function a() { window.status=new Date().getHours()+"時"+new Date().getMinutes()+"分"+new Date().getSeconds()+"秒"; b=setTimeout("a()",500); } //--> </script> </head> <body onLoad="a()"> </body>

  • ある時刻になったら処理

    ASP(VBScript)である時間になったらAの処理を実行するとか○○秒後にBの処理をするにはどうしたらできるのでしょうか? JavaScriptにはsetTimeoutがあるのですが・・・・・・

  • C#で、優先順位をつけてメソッドの呼び出しを調整したいのですが、どんな

    C#で、優先順位をつけてメソッドの呼び出しを調整したいのですが、どんな方法があるでしょうか? ・メソッドA,B,Cがある ・共通に利用するメソッドQがある ・A,B,Cは、別々のスレッドからメソッドQを呼び出す ・他のメソッドがQを利用している間は、B、Cは待ち状態にしたい ・A>B>Cの優先順位があり、BがQを使用していて、Cが待ち状態の時、その後AがメソッドQを利用を要求したら、次にQを使えるのはAにしたい どうぞよろしくお願いします。

  • 一定時間で入れ替わるバナー画像(リンク)を複数個並べたい

    現在、バナー画像と対応するリンクの 一定時間での入れ替えは出来るようになりました。 ※現在のソースを質問の最後に記述してあります。 このような動きをするバナー画像を、縦に複数個並べたいと思い、 いろいろと試してみましたが、うまくいかず大変苦戦しております。 ◆処理イメージ◆ スペース1:バナー1~バナー3を入れ替え スペース2:バナー4~バナー6を入れ替え スペース3:バナー7~バナー9を入れ替え JavaScriptにお詳しい方、実現方法をお教え頂けないでしょうか? 何卒よろしくお願いいたします。 ◆現在のソース◆ <head> <title>インターネット上にあるバナー画像を一定時間ごと入れ替える</title> <script language="JavaScript"><!-- num = 3; jumpURL = new Array(); imgURL = new Array(); jumpURL[0] = "http://aaa"; jumpURL[1] = "http://bbb"; jumpURL[2] = "http://ccc"; imgURL[0] = "http://XXX/0.gif"; imgURL[1] = "http://XXX/1.gif"; imgURL[2] = "http://XXX/2.gif"; function changeImg() { num++; num %= 3; document.banner.src = imgURL[num]; setTimeout("changeImg()",10000); } function jump() { window.open(jumpURL[num]); } // --></script> </head> <body onLoad="setTimeout('changeImg()',5000)"> <a href="javaScript:jump()"> <img src="http://XXX/0.gif" name="banner"> </a> </body>

  • javascriptのコードについて

    以下のコードなのですが、 エンクロージャー関数の ローカル変数hogeをさらに、エンクロージャー内部で定義された 関数ででクロージャーとして保持させたいメソッドのコードですが var Method = function (){ var hoge = "初期値"; var getter = function (){ return hoge; } var setter = function (param){ hoge = param; return hoge; } return {"set" : setter,"get" : getter} } var obj = Method(); console.log(obj); console.log(obj . get()); obj.set("初期値変更"); console.log(obj.get()); obj . set("更に変更"); console.log(obj.get()); この場合、メソッドの返り値として、一般的な文献に乗っている関数(関数オブジェクト)を返すのではなく オブジェクトリテラルとして返しています。 この場合でも、動きとしてはクロージャーの動きをしているのでhogeという変数の保持はできているっぽいんですが クロージャーって関数内で定義された関数であれば、どういう返り値の返し方でも クロージャーになるのですかね? また、この方法は、一般的にjsで関数コンストラクタ呼び出しをしてインスタンスを作る際privateメンバを実現する方法として紹介されていますが、 これはクロージャーとして生成するたんびに内部の変数を保持するためメモリ食い虫になるらしいのですが まず間違いなく、このクラス(便宜上そう呼びます)のインスタンスはひとつしかつくることはない!!という仕様だとしても いけないのでしょうか? というかもう現状javascripのバッドノウハウ的なものになっているのでしょうか?

  • [JS]setTimeoutでクラス関数を使いたい

    他の処理を待ってから、別の処理を実施したい場合に、setTimeoutを使用するのが 一般的だと思いますが、特定のクラスの関数を実行する方法がよくわかりません。 グローバル変数を使用する場合には以下で動きます。 ※待機の部分は、問題を簡略化するため今回は3回実行完了まで、としています。 counter = 0; max = 3; method(); function method(){ if ( counter < max ) { timerId = setTimeout(method, 10 ); console.log(counter); counter++; } else { console.log("done"); } } 出力は以下のとおり。 0 1 2 done methodやcounter, maxなどを隠蔽するため、クラス関数を作り、以下のようにしました。 a = new test(); a.method(); function test(){ this.counter = 0; this.max = 3; this.method = function(){ if ( this.counter < this.max ) { timerId = setTimeout(this.method, 10 ); console.log(this.counter); this.counter++; } else { console.log("done"); } } } 出力は以下のようになってしまい、意図したように実行できていません。 0 done このような場合、どのようにしてクラス関数を再呼び出しするのでしょうか。

専門家に質問してみよう