azu/promises-book を読んでいます(chapter1-2)

以前から読みたかった、JavaScript Promiseの本 を読んでいます。
以下、個人的なメモですが、文章は 文章は CC-BY-NC ライセンスだそうですので
ライセンスを気にしてみます。

CC-BY-NC とは

クリエイティブ・コモンズ・ライセンスとは | クリエイティブ・コモンズ・ジャパン を見ると

原作者のクレジット(氏名、作品タイトルなど)を表示し、かつ非営利目的であることを主な条件に、
改変したり再配布したりすることができるCCライセンス。

だ、そうです。 ですので、作者はazuさんで、タイトルは「JavaScript Promiseの本」と述べておけば良いかな。

以下メモ

写経したりしながらですが、所要時間1時間ちょっと程度。
多少は知っていましたが、細かいところも含めて理解できてきました。
Promise.all 良いですね。

書籍の目的

以下が学べることしてあげられています。明確で良いです。

Promiseについて学び、パターンやテストを扱えるようになること
Promiseの向き不向きについて学び、何でもPromiseで解決するべきではないと知ること
ES6 Promisesを元に基本をよく学び、より発展した形を自分で形成できるようになること

1. Chapter.1 - Promiseとは何か

  • Promiseは非同期処理を抽象化したオブジェクトとそれを操作する仕組みのこと
  • Promise オブジェクトを生成して使う
  • promise.then() で onFulfilled, onRejected のコールバック関数を登録
  • onRejected は promise.catch でも実行可能
  • .catchは promise.then(undefined, onRejected) のエイリアス
  • 状態は Fulfilled, Rejected, Pending がある
  • 一度FulfilledやRejectedになると変化しない
  • PromiseはEvent等とは違い、.then で登録した関数が呼ばれるのは1回限り
  • reject に渡す値に制限はありませんが、一般的にErrorオブジェクト(またはErrorオブジェクトを継承したもの)を渡す

2. Chapter.2 - Promiseの書き方

  • Promise.resolve(value) new Promise() のショートカット
Promise.resolve(42);
// 以下と同等
new Promise(function(resolve){
  resolve(42);
});
  • Promise.resolve を簡単にまとめると、「渡した値でFulfilledされるpromiseオブジェクトを返すメソッド」
    Promise.resolve は共通の挙動である then だけを利用して、 さまざまなライブラリ間でのpromiseオブジェクトを相互に変換して使える
    (jQuery2のように.then というメソッドを持っていた場合でも、必ずES6 Promisesとして使えるとは限らない)
  • Promise.reject(error)は Promise.resolve(value) と同じ静的メソッドで new Promise() のショートカット
  • 同期と非同期処理の混在の問題が起きないようにするため、 Promiseは常に非同期 で処理される
  • taskA → task B という流れをPromiseのメソッドチェーンを使って書くことができます
  • promise chainでの値渡しはreturnで行う
  • Promise#catchは promise.then(undefined, onRejected); のエイリアス
  • IE8ではcatch使用時に工夫が必要
    IE8はECMAScript3であり、catchは予約後なので利用できない
    promise.catch を promise["catch"] に置換するか、thenを使う。
    (多くの圧縮ツールは上記置換を行う)
  • then, catch でそれぞれ新しいpromiseオブジェクトを作成している
  • Promise.all .then に渡される結果の配列は実行順だが、渡されたpromiseオブジェクトの配列を並列に実行している
  • Promise.all は、渡した全てのpromiseがFulFilled または Rejectedになるまで次の処理を待つ
  • Promise.race は、どれか一つでもpromiseがFulFilled または Rejectedになったら次の処理を実行
  • Promise.raceでは、 一番最初のpromiseオブジェクトがFulfilledとなっても、他のpromiseがキャンセルされるわけでは無い
  • .then の第二引数にはエラー処理を書くことができますが、 そのエラー処理は第一引数の onFulfilled で指定した関数内で起きたエラーをキャッチすることはできません
    .then のonRejectedが扱う処理は、その(またはそれ以前の)promiseオブジェクトに対してであって、 .then に書かれたonFulfilledは対象ではない