Bluebird Bluebird는 고성능과 풍부한 비동기 제어 기능을 제공하는 JavaScript 및 Node.js용 프로미스(Promise) 라이브러리입니다.
메서드 체이닝 개요
promise
.then(okFn, errFn)
.spread(okFn, errFn) // * 배열 요소를 개별 인수로 언팩
.catch(errFn)
.catch(TypeError, errFn) // * 특정 에러 타입 필터링 캐치
.finally(fn)
.map(function (e) { /* ... */ }) // * 동시성 제어 병렬 반복
.each(function (e) { /* ... */ }) // * 순차적(직렬) 반복 실행
** 표시된 메서드는 표준 ES6 Promise 규격을 확장한 Bluebird 전용 고유 기능입니다.*
다중 인수 전개 (Promise.spread)
Promise.resolve(['foo', 'bar'])
.spread((item1, item2) => {
console.log(item1, item2); // 'foo', 'bar'
});
참고: Promise.spread 공식 문서: Promise.spread
독립된 프로미스 결합 (Promise.join)
독립적인 복수의 프로미스를 병렬 실행하고 결합 핸들러로 조합:
Promise.join(
getPictures(),
getMessages(),
getTweets(),
(pics, msgs, tweets) => {
return { pics, msgs, tweets };
}
);
참고: Promise.join 공식 문서: Promise.join
배열 컬렉션 비동기 메서드
Promise.all([p]): 모든 프로미스가 이행되면 해결, 하나라도 실패하면 즉시 거부.Promise.some([p], count): 지정된 개수의 프로미스가 성공하면 즉시 해결.Promise.any([p]): 가장 먼저 성공한 단일 프로미스가 해결되면 즉시 해결.Promise.map(array, fn, { concurrency: 5 }): 동시성 제어 옵션을 적용하여 배열 항목 비동기 매핑.
Promise.map(urls, url => fetch(url), { concurrency: 3 })
.then(responses => {
// 최대 3개의 동시 요청으로 제한하여 처리
});
객체 프로미스 해결 (Promise.props)
객체 속성으로 전달된 프로미스들을 병렬 해결하여 결과 객체로 반환:
Promise.props({
photos: getPhotos(),
posts: getPosts()
}).then(result => {
console.log(result.photos, result.posts);
});
프로미스화 (Promisification)
기존 Node.js 콜백 스타일 함수를 모던 Promise 반환 함수로 자동 변환:
const fs = require('fs');
const Promise = require('bluebird');
// 단일 함수를 프로미스화
const readFile = Promise.promisify(fs.readFile);
// 모듈 전체의 메서드를 일괄 프로미스화
Promise.promisifyAll(fs);
// 이제 fs.readFileAsync를 즉시 호출 가능
코루틴 (Generators)
const loginUser = Promise.coroutine(function* (email, password) {
const user = yield User.findOne({ email }).exec();
const valid = yield user.comparePassword(password);
if (!valid) throw new Error('Invalid credentials');
return user;
});