« 独自ドメインにおける DNS の設定 | メイン | Japanize - サブドメインの翻訳について仕様変更のおしらせ »
2006年11月30日
JavaScript で非同期処理
setTimeout って、JavaScript の黒歴史だよね、ってのはおいといて。IT戦記 - 関数を非同期化して汎用性を高めるを見て、おもしろそうだったので汎用化してみました。でも、あまり実用性がなさそうです。
function async(wait) { if (arguments.length == 1) return; var conn = arguments[arguments.length - 1]; for (var i = arguments.length - 2; i != 0; i--) { conn = (function (f, c) { return function () { var args = [ f.apply(null, arguments) ]; setTimeout( function () { c.apply(null, args); }, wait); }; })(arguments[i], conn); } conn(); } async( 10, function () { return 'a'; }, function (x) { return x + 'b'; }, function (x) { return x + 'c'; }, function (x) { alert(x); });
残念ながら、JavaScript には非同期メッセージを同期化する方法はない!残念!><ほんとに残念!
JavaScript 1.7 なら yield でできるんじゃないかと思いました。
投稿者 kazuho : 2006年11月30日 10:58
トラックバック
このエントリーのトラックバックURL:
http://labs.cybozu.co.jp/cgi-bin/mt-admin/mt-tbp.cgi/942
このリストは、次のエントリーを参照しています: JavaScript で非同期処理:
» JavaScript/1.7 で協調的マルチスレッド from Kazuho@Cybozu Labs
JavaScript/1.7 の話なので Firefox 限定です。以前、 ... [続きを読む]
トラックバック時刻: 2007年05月25日 13:51
コメント
これ動かないですよ
投稿者 通りすがり : 2006年12月04日 18:31
通りすがりさん、指摘ありがとうございます。
IE だと動かなかった (setTimeout の第3引数はサポートされないらしい) ので、修正しました。
投稿者 kazuho : 2006年12月04日 21:03