JavaScript
promise

手っ取り早くPromiseでループ処理を書きたいとき

function hoge() {

// 非同期処理
}

for (var i = 0; i < 10; i++) {
hoge(i); // 待ってくれない・・・
}

Promiseを使ってループ処理を書く場合はbluebirdなどを使うことが多いが、

今回は外部ライブラリを使わずにループ処理を書く方法を紹介する。


Promise Loop

for文やwhile文に対応する。

param
name
description

param1
callbackFn

param2
conditionFn
return false to end loop

param3
incrementFn


promiseLoop.js

Promise.loop = function (callback, condition = () => true, increment = () => { }) {

function onErr(resp) {
errResp = resp;
success = false;
return false;
}

var errResp;
var success = true;

return (function loop() {
return Promise.resolve(condition())
.then((resp) => resp === false ? false : callback(), onErr)
.then((resp) => resp === false ? false : increment(), onErr)
.then((resp) => resp === false ? false : loop(), onErr);
})().then(function () {

if (success) {
return;
} else {
throw errResp;
}

});

};



サンプル


sample1.js

var i = 0;

var max = 10;

Promise.loop(function () {
return new Promise(function (resolve) {
console.log(i);
setTimeout(resolve, 1000);
});
}, () => i < max, () => i++);



結果


console

0

1
2
3
~
99


Promise Each

Array.prototype.forEach()に対応する。

param
name
description

param1
array

param2
callbackFn(value, index, array)
return false to end loop


promiseEach.js

Promise.each = function (array, callback) {

var i = 0;
var length = array.length;

return Promise.loop(() => callback(array[i], i, array), () => i < length, () => i++);

};



サンプル


sample2.js

var array = ["a", "b", "c", "d"];

Promise.each(array, function (n, i) {
return new Promise(function (resolve) {
console.log(n);
setTimeout(resolve, 1000);
});
});



結果


console

a

b
c
d