2020年10月4日日曜日

JavaScriptの非同期処理を理解する その2 〜Promise編〜

 …という記事をさくらのナレッジに寄稿しました。その1はコールバック編です

非同期処理でつまづくプログラマーが多い中、いかにPromiseをわかりやすく説明しようかと考えた結果、Promiseを実装しちゃえという結論に達しました。

Promiseの実装例としてはbluebirdとかcore-jsとかpromisejs.orgなんかが有名ですが、これらはES2015へ準拠している代わりに内部で細かな調整を行っているため初学者が読んでスラスラと理解できるものではありません。

そこで、厳密に準拠しない代わりに最小限のコードのみで実装したオレオレPromiseを作り、さらに初学者にも理解しやすいように実装の過程をコミットログに残してみました

リポジトリーどれよ

shimataro/yakusokuです。オレオレPromiseはYakusokuという名前のクラスで実装しました。

全部で7つのコミットがあります。

  1. 内部状態の作成
  2. コンストラクターの作成
  3. then() / catch() の実装 ※ただし不完全
  4. then() / catch() の改良(内部状態が変更された時点でコールバックを呼び出す) ※まだ不完全
  5. then() / catch() を完成(メソッドチェーンを実装)
  6. race()を実装
  7. all()を実装

こんな流れです。

ES2015に完全準拠していないとはいえ、150行にも満たないコードで基本的な機能を実装できたことには少し驚きました。もっと複雑になるかと思っていたので。

中でもrace()をたった8行で実装できたのはびっくり。そのかわり(?)all()が少し複雑になっていますが。

次回はasync/awaitの解説を予定しています。どう解説すればわかりやすくなるのか、まだネタがまとまっていません。

余談

コールバック編のはてブPromise編のはてブの数が全然違っていてちょっと笑いました。コールバックの解説の需要がないのかPromiseの解説の需要があるのか・・・

0 件のコメント:

コメントを投稿