Node.jsで、Promiseを使用したイテレーションのデザインパターンについて学んだので書いていく。
複数の、Promiseオブジェクトを返すタスクを逐次実行するのには、以下のパターンが有効
let tasks = [task1, task2, task3]
let promise = Promise.resolve()
function task1() {
Promise.resolve(console.log('task1 completed'))
}
function task2() {
Promise.resolve(console.log('task2 completed'))
}
function task3() {
Promise.resolve(console.log('task3 completed'))
}
tasks.forEach(task => {
console.log('task handled')
promise = promise.then(() => {
return task()
})
})
console.log('all tasks handled')
promise.then(() => {
console.log('all tasks completed!')
})
このコードを実行すると、コンソールは以下の通りになる。
> "task handled"
> "task handled"
> "task handled"
> "all tasks handled"
> "task1 completed"
> "task2 completed"
> "task3 completed"
> "all tasks completed!"
このように、配列にタスクを格納し、それをforEachなどで回してpromiseのチェーンを繋いでいくイメージ。
また、forEach
の代わりにreduce
を用いるとよりコンパクトに書くことができる。↓
let tasks = [task1, task2, task3]
function task1() {
Promise.resolve(console.log('task1 completed'))
}
function task2() {
Promise.resolve(console.log('task2 completed'))
}
function task3() {
Promise.resolve(console.log('task3 completed'))
}
let promise = tasks.reduce((prevPromise, task) => {
console.log('task handled')
return prevPromise.then(() => {
return task()
})
}, Promise.resolve())
console.log('all tasks handled')
promise.then(() => {
console.log('all tasks completed!')
})