Buzzurlの中の人日記

※追記:あまりにも記事タイトルが適当すぎて我ながら日本語でおkと思ったのでタイトルを変えました。


http://labs.cybozu.co.jp/blog/kazuho/archives/2006/12/oo-settimeout.php


http://blog.livedoor.jp/dankogai/archives/50714622.html


このネタはmalaさんが1年半前に通過した地点なのである程度常識の部類かと思ってました。


でもdankogaiがわざわざやるってことは知らない人も多そうだし、malaさんが同じネタをまたやるようにも思えないので、ついでにLDRに現在使われてるFunction.prototype.laterとかを紹介してみる。




Function.prototype.later = function(ms){
var self = this;
return function(){
var args = arguments;
var thisObject = this;
var res = {
complete: false,
cancel: function(){clearTimeout(PID);},
notify: function(){clearTimeout(PID);later_func()}
};
var later_func = function(){
self.apply(thisObject,args);
res.complete = true;
};
var PID = setTimeout(later_func,ms);
return res;
};
};



LDRのFunction.prototype.later()


later()の戻り値で、中断とか即実行とかを処理するオブジェクトを返してます。


dankogaiのやり方だとオブジェクトのtimeoutプロパティを汚染しちゃうけど、こちらのやり方はsetTimeout()の戻り値をクロージャ内で処理していて汚染が少ないのがエレガント。


使うときはこんな感じ




function example(msg){
alert(msg);
}

//~~~

//遅延実行
var task = example.later(1000)('hello');

//~~~

//キャンセル
task.cancel();

//~~~

//まだ実行してなかったら、やっぱり即実行
if(!task.complete){
task.notify();
}



キャンセルとか即実行とか終了確認が必要なければlater()の戻り値を無視するだけ。


人様の書いたソースの解説でちょっと申し訳ないですが、LDRのソースはこの手のイディオムの宝庫なので読むと勉強になりますよ、と。




function hoge(cond1, cond2){
return (cond1) ? "boo" : (cond2) ? "foo" : "woo";
}


と書きたくて



function hoge(cond1, cond2){
return
(cond1) ? "boo" :
(cond2) ? "foo" : "woo";
}


と書いたら期待通り動かないと思くてはまった。


後者は↓と解釈されるのね。。。



function hoge(cond1, cond2){
return;
(cond1) ? "boo" :
(cond2) ? "foo" : "woo";
}


プロフィール
HN:
ajiyoshi
性別:
男性
自己紹介:
プログラマです。
ソーシャルブックマークサービス「Buzzurl」の開発者です。

はてなブックマークカウンタ


旧*「ふっかつのじゅもんがちがいます」カウンタ
Buzzurl

powered by Buzzurl

Twitter

カレンダー
08 2010/09 10
S M T W T F S
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
最新コメント
[07/23 つらら]
[07/23 れいら]
[06/16 婚活]
[05/28 あっだ]
[05/28 もも]
最新トラックバック
バーコード
ブログ内検索
忍者ポイント
カウンター
アクセス解析
あわせて読みたい
あわせて読みたい
Powered by ニンジャブログ  Designed by ゆきぱんだ
Copyright c *「ふっかつのじゅもんがちがいます。」 All Rights Reserved
忍者ブログ / [PR]保険見直し 資格