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 っぽいものが書けたので満足した。