wait,sleep相当の待ちのやり方
以下のやり方でsleepしてると、その間はsetIntervalで回している処理が実行されなかった。(Firefox8、Chrome15)
setInterval('a()',100); for(var i = 0; i < 1000; i++){ b(i); sleep(100); } c(); // 指定ミリ秒待つ function sleep(t){ var d1 = new Date().getTime(); var d2 = new Date().getTime(); while(d2 < d1+t){ d2 = new Date().getTime(); } return; }
以下のやり方に変えたら、うまくいった。
しかし、考え方自体が変わっている。何となく、頭悪い感じがする。
間に「sleep(100)」とか入れればその間その処理だけ待ってくれてsetIntervalも実行されるみたいな関数は作れないみたいだ。
作れるのか?
var flag = false; setInterval('a()',100); for(var i = 0; i <= 1000; i++){ if(i == 1000){ flag = true; } setTimeout('b('+i+','+flag+')', 100*i); } function b(val, flag){ // b()の処理はじまり ... // b()の処理おわり if(flag == true){ c(); } }
参考
JavaScriptの動かないコード (中級編) setTimeoutのタイマーが指定時刻に動かないエラー (JavaScriptがマルチスレッドだという誤解) - 主に言語とシステム開発に関して
JavaScriptはシングルスレッド。(マルチスレッド化するライブラリがあるらしいが)
シングルスレッドなのは分かるけど、今回の俺の問題は、whileなどのループとsetIntervalのどっちを優先するかの問題のはずだ。
whileが、間断なく処理をしまくっていると、「setIntervalの席ねーから!」と他の処理をさせない。これは、仕様なんだろうか?
処理の優先度は対等であっても不思議ではないはずだが、押し並べてwhileの方が優先される。
それとも、setIntervalが実行されないのは、他のことが原因なのだろうか。。。
一番上の例のsleep関数にa();を入れてもa()は実行されなかったしなあ。これはおかしいよね。(a()はcanvasを描き直す処理だった)
これは、検索エンジンから迷い込んだプログラマを不確実な情報で惑わす有害な記事かもしれません。