JavaScript とコールバック 13:02

Posted at 2010/03/06 13:02, Modified at 2010/03/06 13:10

JavaScript で XMLHttpRequest -> レスポンスを parse -> 取得した URI に XMLHttpRequest というありがちなものを書いていて、ありがちに関数がネストしていった。そろそろ Deferred (MochiKit でも JSDeferred でも) の使い方を覚えなきゃだめかなあ、と思いながら、自分でなんとかする関数を書いた。

function compose() {
    var result;
    var i;
    for (i = arguments.length-1; i > -1; i--) {
        result = (function (f, g) {
            return function () {
                f.apply(null,
                        [g].concat(Array.prototype.slice.call(arguments)));
            };
        })(arguments[i], result || new Function);
    }
    return result;
}

こんなふうに使う:

function get(uri, callback) {
    var req = new XMLHttpRequest;
    req.open('GET', uri, true);
    req.onreadystatechange = function () {
        if (req.readyState == 4 && req.status == 200) {
            callback(req.responseText);
        }
    };
    req.send(null);
}

// In your application...
    compose(
        function (callback) {
            get(anchor.href, callback);
        },
        function (callback, html) {
            var m = html.match(PATTERN);
            if (m) {
                callback(m[0]);
            }
        },
        function (callback, uri) {
            get(uri, callback);
        },
        function (callback, js) {
            var images = eval(js);
            images.forEach(function (image) {
                li.appendChild(createImage(image));
            });
        }
    )();

ひさしぶりに JavaScript っぽいものが書けたので満足した。

0 comments
riddle for guest comment authorization:
Where is the capital city of Japan? ...

blog.8-p.info加藤和良 の個人的なブログで、プログラミングのはなしが多めです。