JavaScriptのPromiseについて学ぶ書籍であるJavaScript Promiseの本 v2をリリースしました。

Promise本 1.0.0をリリースしたのは2014年6月ですが、そこから少しづつアップデートしていました。

今回のメジャーアップデートとなる2.0.0では、サンプルコードのコードベースをES2015前提のものへと変更しています。 1.x系からの主な変更点としては次のものがあります。

  • ES6ES2015に表記を変更
  • コードベースをES5からES2015+(ES2015以降ベース)に変更
  • Async Functionの章を追加
  • Promise#finallyの対応

v2の変更点

Promise本 v2の主な変更点は次の通りです。

コードベースをES5からES2015+に変更 #249 #323

(Promise以外は)ES5ベースだったサンプルコードをES2015ベースにすべて書き換えました。 そのため、サンプルコードにもES2015の構文を使っています。

  • Arrow Function
  • const
  • class
  • Async Function(ES2017、章として追加)

変更理由としては、ES2015のほうが簡潔に書ける部分(classを使ったDeferredなど)があることや、 varよりもconstletの利用を促す傾向が全体的にあるためです。

ES2015の基本的な文法に不安がある方は、ES2015ベースのJavaScript入門書であるJavaScript Primerも作成しているので、併せて読んでみてください。

また、サンプルコードがES5のものを読みたい場合はPromise本 v1のアーカイブも作成してあるので、こちらを参照してください。

Async Functionの章を追加 #246 #317

新しい章として5. Chapter.5 - Async Functionを追加しました。

Async Function(asyncawait)はES2017で追加された新しい非同期処理に関する構文です。 ただし、Async Functionの内部的な処理にはPromiseが大きく関係しています。 そのため、Async FunctionとPromiseのどちらかを使えば良いという話ではなく、Async FunctionとPromiseは共存する関係にあります。

この章では、Async Functionの基本的な使い方から典型的なユースケースなどを見ていきます。

Async Generatorについては触れていないため、この辺は今後の課題です。 (そもそもGeneratorについて触れてない)

Promise#finallyの対応 #284 #294

ES2018からPromiseチェーンの最後の処理を簡潔に書けるPromise#finallyメソッドが追加されました。 その解説を2.6. Promise#finallyに追加しています。

その他

寄付手段としてGitHub Sponsorsを追加

寄付の手段としてJavaScript Promiseの本 付録を好きな値段をつけて購入する以外にも、GitHub Sponsorsでの寄付を追加しました。

Promise本専用のプランは特に用意してませんが、何か希望があったら言ってください。

HTTPS

ウェブサイトが https://azu.github.io/promises-book/ のように https になっています。

Fetch APIとAbortController

PromiseベースのAPIであるFetch APIやキャンセル処理であるAbortControllerについても簡単に触れています。

本文はXHRをラップしたfetchURLベースで話を進めていますが、この処理も少しだけFetch APIに寄せています。(もともとはgetURLという名前だった。fetch get + res.ok + res.text()のイメージ)

DocTest

内部的にpower-doctestを使ったテストを一部に取り入れました。

CONTRIBUTING.mdにもDocTestについてを追加しました。 コントリビューション待ってます!

今後の予定

JavaScript Promiseの本は、次のような目的で書かれています。

この書籍を読むことで学べる事として、次の3つを目標にして書きました。

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

-- JavaScript Promiseの本を書きました | Web Scratch

基本的には今もこれは変わってなくて、Promiseで迷ったときにここ見ればとりあえずわかるようなものを目指しています。 また、ECMAScriptの仕様が今も更新され続けているようにPromiseやAsync Function周りもまだ仕様が変更され続けています。

書籍を見ればわかるものを作るためには、書籍もそれに追従できるような仕組みになっていないとできません。

こういう形態で書籍を公開したのは、常に書籍が更新出来るようにしたいからでもあります。
-- JavaScript Promiseの本を書きました | Web Scratch

JavaScriptにおけるPromiseは、まだAPIが不十分なところがあるため、APIが拡張されています。 直近のものとしてはPromise.allSettledはES2020で入ることが確定(Stage 4)であるため、対応が必要になりそうです。

またAsync Functionに関しては他の構文に対しても組み込まれているため、変更の幅が広いです。 例えば、Dynamic Importにも非同期が関係しているため、その辺と関連した内容が必要になるかもしれません。

このような変更に対応していくためにも、Promise本ではコミッターを募集しています。 Promise.allSettled (ES2020) · Issue #330 · azu/promises-bookは、やることが大体決まっているので手が出しやすいかもしれません。興味ある人は一緒に進めましょう。

書籍もライブラリのように途中でメインのメンテナーが変わってもいいはずなので、そのような形にできたほうが更新が続けられるんじゃないかなと思います。

Promise本の細かい書き方とかはCONTRIBUTING.mdにあるので、興味がある人は見てみてください。 (js-primerに比べれば、結構勢いで書いてる部分も多いのでざっくりしたガイドラインです)

他にもサンプルコードが古いままだったり、間違いもあるかもしれないので、そういうのを見つけたらIssueを立てたり、Pull Requestをだしてみてください!

おわりに

JavaScript Promiseの本 v2の詳細な変更についてはリリースノートを参照してください。

また@laco2netと一緒に書いてるJavaScript Primer #jsprimerの方も現在書籍化に向けて最終的な調整をしている段階です。 書籍として出版されたときに通知を受け取りたい人は、Topページにあるメールフォームからメールアドレスを登録しておけばリリース時に通知されます。

JavaScript Promiseの本 v2のリリースにあわせてGitHub Sponsorsの募集ページも公開してみたので、興味がある人は見てみてください。