こんな感じのループ処理をPromiseでやりたい。
for (var i = 0; i < 10; i++) {
console.log(i);
}
console.log('END!!!');
関数を作ってみた。
function loop(init, condition, callback, increment) {
return new Promise(function(resolve, reject) {
init().then(function _loop() {
condition().then(function(result) {
if (result)
callback().then(increment).then(_loop, reject);
else
resolve();
}, reject);
}, reject);
});
}
init
, condition
, callback
, increment
はそれぞれ全てPromise
を返す関数として実装します。
同期処理的に書くとこんな感じ。
for (init(); condition(); increment()) {
callback();
}
使い方
var i;
loop(function() {
return new Promise(function(resolve, reject) {
i = 0;
resolve();
});
}, function() {
return new Promise(function(resolve, reject) {
resolve(i < 10);
});
}, function() {
return new Promise(function(resolve, reject) {
console.log(i);
resolve();
});
}, function() {
return new Promise(function(resolve, reject) {
i++;
resolve();
});
}).then(function() {
console.log('END!!!');
});
上記の例ではresolve
しか呼んでませんが、ループ途中で例外を投げたりreject
を呼ぶと処理を中断してループを抜け、loop関数が返したPromise
がrejected
になります。
うーんもっと簡単に書けないかなぁ…
return new Promise
は固定なのでloop
の中に入れるという手もある。ただPromiseをどうやって生成するかはプログラマ側に任せたほうが良いかもしれない。Promise対応ライブラリの呼び出しということもありうるし。