ukyoweb.com

Promiseを使うと何が嬉しいの?ってのとPromiseのハマりポイントとか

ES6 Promises1そろそろ使ってみようかなって人向けに良い点、悪い点など。

良い点

  1. 同期的な関数と非同期的な関数が同等に扱えるようになる。これはエラーハンドリングしかり。
  2. 関数型のプログラミングが容易に行えるようになる。
  3. 各処理は細かい単位で関数化されて見通しがよくなる。
Promise.resolve(val)
.then(syncFn)
.then(asyncFn)
.then(syncFn)
.catch(console.log.bind(console));

悪い点とかハマりポイントとか

エラーハンドリングをPromiseのルールで扱うためには同期関数はPromise内で扱う必要がある。

// bad: syncFnでエラーが起きたらcatchで捕捉できない
asyncFn(syncFn(val))

// good
Promise.resolve(val)
.then(syncFn)
.then(asyncFn);

// or
new Promise(function(resolve) {
  resolve(syncFn(val))
})
.then(asyncFn);

Promise.allとか配列でやってくるので面倒。

// ES6の記法さえあれば
Promise.all([promise1, promise2, promise3, promise4])
.then(function([a, b, c, d]) {
  //...
});

// とりあえずこれで解決  
Promise.all([promise1, promise2, promise3, promise4])
.then(Function.prototype.apply.bind(fn, null));

onFulfilled, onRejectedに渡る引数は1つだけ。これはPromise.allと同じ問題かも。 つまりES6はやくこないかなってことで。

// bad
Promise.resolve(1, 2, 3).then(console.log.bind(console));

// 配列かオブジェクトで渡す。
Promise.resolve([1, 2, 3]);

Promise.resolve({
  firstName: 'foo',
  lastName: 'bar'
})
.then(function({firstName, lastName}) {
  //...
});

まとめ

ES6 Promisesは現状でも十分に強力だが、いまのところはちょっと書きにくいなあと感じることもあるよねって話。とりあえず使いたい場合はbluebird2 とかかな。


  1. https://github.com/jakearchibald/es6-promise 

  2. https://github.com/petkaantonov/bluebird