AX
【Javascript】 JavaScriptでwaitする方法 改
アクセスログを見ていると2005/10/23に書いたJavaScriptでwaitする方法の記事がよく閲覧されていると気づいた。

ただのメモとして書いた記事なのにたくさんの人が見ていてびっくり!たぶん見に来た人はただのメモ書きと知ってさぞかしがっかりして帰っていたのだろう・・・。申し訳ない・・・(´・ω・`)
というのもあのブログではjavascriptでのwaitの方法は書いていない。単純にfunctionの実行を遅らせる方法をブログの記事にしただけである。

そこで、今回はちゃんとwaitする方法を考えてみた。
前回も書いたが、
C言語にはsleep()という関数が存在し、引数として数字を与えてやれば、
その与えた時間だけ処理が止まる。

例えば、sleep(1000)なら1秒処理が止まってくれる。(単位はミリ秒)

Javaにも似たようなものがあり、wait()というメソッドが存在する。同じようにwait(1000)のようにして使う。

しかし、これと同等な機能はjavascriptにはない。
ということで自分で作ってみた。


function wait(ms) {
var d = new Date();
d.setTime(d.getTime() + ms);
while (new Date().getTime() < d.getTime());
}


指定された時間が経つまでループをして処理を止める。これでいけるはず。
ということで実行してみると ちゃんと処理が止まることを確認!!そしてそれと同時にザ・ワールド!!ブラウザも固まってしまいしたΣ( ̄□ ̄;)!!
CPUを50%(私のマシンは2コアなので実質100%)も使用してファンが唸りだす勢いです。
この方法だとループの処理にCPUが使用されブラウザは一切応答しなくなってしまいます。軽いブラクラです。ちなみにsafariだと危険なJavascriptが実行されているということで警告出てきました。orz

この方法はよくない。きっと誰も考えついて、破棄していったコードだろう・・・。





function wait(ms) {
var f = wait.caller.toString();
f = f.replace(/\s*\/\/.*(\r|\n)*/g,"");
f = f.replace(/\/\*.*\*\//g,"");
f = f.replace(/(\r|\n)/g,"");
f = f.replace(/function[^{]*{/,"").replace(/}$/,"");
f = f.substring(f.search("wait\\(\\s*[0-9]*\\s*\\)")+1);
f = f.substring(f.indexOf(";")+1);
setTimeout(new Function(f),ms);
throw "wait " + ms + "ms";
}

ということでもう1つ考えてみた。

呼び出しを行ったfunction(waitしたいfunction)を再起的に呼び出す方法。
説明が下手で意味不明かもしれないが、だいぶバカなやり方です。

この方法ならばCPUを無駄に使用することなく処理をwaitさせることが可能です。
動作の確認はSafariでしか行っていません。他のブラウザで動かなかったらごめんなさい。

一応できたはできたのだが、このwaitのfunctionは非常にバギーです。というか、動かないケースは既に把握しています。

まず、他のオブジェクトなどでwaitと名のつくfunctionがあると正常に動作しなくなる可能性があります。
他には任意のfunction内でこのwaitを使っているfunctionを呼ぶとバグります。

ほかにも特殊条件下でバグる可能性がありますが、その辺を理解した上で使えそうだったら使っていただけたらと思います。
[PR]
by manodeldio | 2009-12-19 22:15 | プログラミング


<< 【謹賀新年】あけましておめでと... 【コンピュータ】Googlle >>