« メッセージキュー事始め in Perl - コマンドラインクライアントを作ってみた | メイン | djbdns にパッチをあてて Anti-DNS Pinning 対策 »
2007年11月08日
Re: for 文を setTimeout に変換する
for 文を setTimeout に変換する - IT戦記の件。おもしろい。自分だったらこう書くかなと思いました。
function timeout_for(f1, f2, f3, fe) { var i = typeof f1 === 'function' ? f1() : f1; var rep = function () { if (typeof f2 === 'function' ? f2(i) : (i < f2)) { setTimeout( function () { fe(i); i = typeof f3 == 'function' ? f3(i): i + 1; rep(); }, 10); } }; rep(); }
簡単な使い方 (for (i = 0; i < 3; i++) に相当)
timeout_for( 0, 3, 1, function (i) { alert(i); });
条件をコールバックで設定
timeout_for( function () { return 0; }, function (i) { return i < 3; }, function (i) { return i++; }, function (i) { alert(i); });
変数は外部で保持しても良い
var i = 0; timeout_for( function () {}, function () { return i < 3; }, function () { i++ }, function () { alert(i); });
もちろんネストも可能
timeout_for( 0, 3, 1, function (i) { timeout_for( 1, 4, 1, function (j) { alert(i + ',' + j); }); });
あとは、同一のインターフェイスをもつ非timeout版の実装を用意しておいて、切り替えて使うとか。
function ordinal_for(f1, f2, f3, fe) { for ( var i = typeof f1 == 'function' ? f1() : f1; typeof f2 === 'function' ? f2(i) : (i < f2); i = typeof f3 === 'function' ? f3(i) : i + 1) { fe(i); } } timeout_for(0, 3, 1, function (i) { alert(i); }); ordinal_for(0, 3, 1, function (i) { alert(i); });
投稿者 kazuho : 2007年11月08日 16:19
トラックバック
このエントリーのトラックバックURL:
http://labs.cybozu.co.jp/cgi-bin/mt-admin/mt-tbp.cgi/1636
このリストは、次のエントリーを参照しています: Re: for 文を setTimeout に変換する:
» [javascript][async]ループをsetTimeoutでまわす、Afrous版 from snippets from shinichitomita’s journal
for 文を setTimeout に変換する - IT戦記 Kazuho@Cybozu Labs: Re: for 文を setTimeout に変換... [続きを読む]
トラックバック時刻: 2007年11月08日 21:36
» javascript - setTimeout()化とネスト from 404 Blog Not Found
amachangの例題の場合もそうだが、これには一つ問題がある。
Kazuho@Cybozu Labs: Re: for 文を setTimeout に... [続きを読む]
トラックバック時刻: 2007年11月09日 23:22