« 独自ドメインにおける 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