Node.js에서 bluebird 패키지를 이용하면, ES6의 Promise를 map function과 함께 사용할 수 있다.
bluebird의 map 함수는 Iterable한 value와 각 value를 위한 mapper function을 인자로 한다.
좀 더 살펴보자.
Promise, Resolve, Reject
map 함수는 Promise를 반환하며, 각 mapper function 또한 Promise를 반환한다. 하나 이상의 mapper function이 reject를 반환하면 map 또한 reject를 반환한다. map은 모든 mapper function이 fulfilled일때 fulfilled이다.
Order
각 value에 대한 mapper function의 실행은 그 순서가 보장되어있지 않다. 즉, 각 mapper function은 random한 순서(나의 테스트에서는 주로 역순이었다.)로 실행된다. 만약 순서를 보장받고 싶다면, mapSeries 함수를 사용하면 된다.
[optional] Concurrency
map함수는 optional한 세번째 인자를 갖는다. 이 값은 동시에 실행될 mapper function의 수를 제한하는데 사용된다. mapper function이 매우 많은 자원을 요구하거나 동시성 제약이 갖는 등, 다양한 이유로 인해 이것이 필요할 수 있다. 한편 이 값의 형식은 object인데, 아마 다른 옵션이 추가될 경우를 고려한 것 같다.
Example
아래는 optional 인자를 포함한 예제이다. 앞서 설명했듯이 mapper function의 실행순서는 보장되지 않기 때문에 실행결과가 매번 다를 수 있다. concurrency의 값을 바꾸거나 아예 없애고 실행해보라.
let Promise = require('bluebird');
Promise.map(
[1, 2, 3, 4, 5],
n => new Promise((resolve, reject) => {
setTimeout(() => {
console.log(n);
resolve();
}, 500);
}),
{ concurrency: 2 }
);