- ふと思いついたのでメモ代わりに
- promiseの実装としてjQuery.Deferredを使用
function fact(n) {
var d = $.Deferred();
setTimeout(function() {
function onResolved(result) {
d.resolve(result * n);
}
n > 1 ? fact(n - 1).then(onResolved) : d.resolve(n);
}, 100);
return d.promise();
}
fact(5).then(console.log.bind(console)); // 120
追記(非同期じゃなくても書けた)
function fact(n) {
var d = $.Deferred();
n > 1 ? fact(n -1).then(function(result) { d.resolve(result * n) }) : d.resolve(n);
return d.promise();
}
fact(5).then(console.log.bind(console)); // 120
でも普通はこう書く
function fact(n) {
return $.Deferred().resolve(function fact(n) {
return n > 1 ? fact(n - 1) * n : n;
}(n));
}
一般的にPromiseを返す関数にしたければ
function toPromise(fn) {
return function() {
var d = $.Deferred();
try {
d.resolve(fn.apply(null, arguments));
} catch (e) {
d.reject(e);
}
return d.promise();
};
}
toPromise(function fact(n) { return n > 1 ? fact(n - 1) * n : n })(5).then(console.log.bind(console));