빠른 참조

Bluebird.js Promise 라이브러리 치트시트

Bluebird.js 퀵 레퍼런스: spread 전개, 에러 캐처, Promise.join, Promise.all, Promise.props, 프로미스화(promisify) 및 코루틴.

· 게시일

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;
});

관련 주제