Git Product home page Git Product logo

promises-book's Introduction

Promises Book test Gitter chat

JavaScript Promiseについての薄い電子書籍です。

作者をサポートしたい場合は、次の手段が利用できます。

過去のバージョンについては次のページから参照できます。

This book has been released in :

Installation

この書籍はAsciidocフォーマットで書かれています。

Asciidoctorでビルドすることができます。

HTMLのビルド

bundle install --path vendor/bundle
npm install
make html
open index.html

PDFのビルド

フォントには源真ゴシック (げんしんゴシック) | 自家製フォント工房を利用しています。

必要なもの

git submodule update --init
make pdf
open javascript-promise-book.pdf

Epubのビルド

まだ完成度が高くないため品質はよくありません。 HTML版はスマートフォン等画面が小さくても見られるようになっているためそちらの利用を推奨します。

gem install specific_install
gem specific_install -l https://github.com/asciidoctor/asciidoctor-epub3
asciidoctor-epub3 -D output index.adoc

Contributing

Pull RequestやIssue等お気軽にどうぞ。

Gitter chat に書き込むだけでも問題ないです。

Pull Requestする場合は CONTRIBUTING.md も参考にして下さい。

  1. Fork it!
  2. Create your feature branch: git checkout -b my-new-feature
  3. Commit your changes: git commit -am 'Add some feature'
  4. Push to the branch: git push origin my-new-feature
  5. Submit a pull request :D

License

プログラムコードはMITライセンスで利用できます。

文章についてはCreative Commons Attribution-NonCommercialで利用できます。

クリエイティブ・コモンズ・ライセンス

promises-book's People

Contributors

alpha3166 avatar anoriqq avatar azu avatar dependabot[bot] avatar gunyarakun avatar harashoo avatar hasebe avatar hibariya avatar hidekuro avatar kubosho avatar ma2gedev avatar matamatanot avatar miyohide avatar munierujp avatar oogfranz avatar oohira avatar readmecritic avatar satoke avatar seikichi avatar syoichi avatar t-f-m avatar t-mochizuki avatar tkybpp avatar tricknotes avatar vzvu3k6k avatar watagashi avatar wataruhirayama avatar yamotuki avatar youkinjoh avatar znz avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

promises-book's Issues

Road to 1.0.0

Road to 1.0.0 JavaScript Promise Book

Promiseのライブラリについて

Native PromiseはFirefox29、Chrome35あたりから使えるけど、
現実的にはライブラリを使ったほうがサポート範囲広いし、便利な機能も多いので簡単に紹介する。

どちらも優れたAPIリファレンス持ってるので、これも紹介しておきたい。

書籍でのPromise実行環境について

#12 と関係するけど、この書籍に出てくるサンプルを実行する環境の定義、紹介やjsfiddle的なの実行出来るやつが必要そう。

#17 と合わせてもいい気がする。

埋め込んでるサンプルコードで、基本的にincludeで書いてるやつはそのままコピペで実行できるようなコード(Promiseがあれば)だと思うので、asciidocの埋め込みマクロでコードに印を付けて、
JavaScriptでjsFiddle APIを叩いて実行用のページを開くとかできると良さそう。

[source,js]
----
include::embed/embed-code.js[]
----

それぞれのコードのjsFiddleを真面目に用意するのは更新コストが高い。

Not throw, Use reject

安易にthrowしないで、rejectを積極的に使おうという話。

ネイティブの実装でもthrowは結局どうやってとめているかというとtry catchしてるだけなので、rejectを使ったほうがtryにかからないで明示的にpromiseオブジェクトをrejectedにできる。

new Promiseは簡単だけど、thenの中でもthrowを使わないでrejectするには、
thenで返すpromiseオブジェクトをnew Promiseで作ればいける

PromiseとDeferredの違い

PromiseとDeferredの違いについて

Deferredは

Twisted -> MochiKit/Dojo -> Promises/A -> jQuery.Deferred

時系列適当…

Deferred ∋ Promise という関係は明確だけど、細かい仕様はPromise/A+とかみたいなのがないきがするから、イマイチDeferredと言われた時に何をしめすものなのか分からない。(たいていはjQeuryになるんだろうけど)

正直そこまで詳しくないし、あまり興味持ってないから寄稿して欲しい感じ…

第4章の内容を決定する

方針としては2つありそう

  • 実用的なサンプルを中心にする
  • アンチパターンや応用例等を中心とする

3章までそこまで実用的な話入れてないし、あんまり具体的なの大変そうなので、
#1 で書いた目的にそってアンチパターンとかを紹介する感じがいいかなと思ってる

What is `done`?

promiseおけるエラーハンドリングが強すぎる影響で、逆にエラーを握りつぶしてしまいがち。

そういう趣旨で登場し、多くのライブラリに実装されている
doneとは何かについて

Promiseの`then`は新しいオブジェクトを返す話をもう少し詳細に

http://azu.github.io/promises-book/#then-or-catch
で最後にちょっとだけ触れているけど、
thencatchPromise.allなど全部新しいpromiseオブジェクトを作って返しているというのはどこかで知らないとハマるような気がするので、
もうちょっと詳細に書く。

主戦軸とはちょっと違うので"コラム"的な位置で入れしまうのがいい気がする。
(そもそもコラムてのが何か用語的に変だ)

  • コードで証明
  • promiseを拡張する際に意識する必要がある

表記の統一

書籍の用語の表記のぶれや説明の仕方にぶれがあるので、出来るだけ統一した書き方をする。

  • Promise

❌ Promises

Promiseという機能について言う時は大文字の単数を使う。

例外としてES6 Promisesの仕様へのリンクを貼る時はsをつけてもよい。

小文字は基本的にpromiseオブジェクトのみにする。

related #7

  • thenで登録するコールバック関数

thenで渡すコールバック関数の事

thenで登録するコールバック関数 という書き方を大体してるが、他の書き方の方が分かりやすいかどうか?

thenに登録するハンドラ?

thenで登録されたコールバック関数

という表記にする。

  • FulFilled または Rejected

いわゆるSettledの状態になった時という意味。
短縮しないで、毎回両方の状態について書いてる。

解決された時という書き方だと誤解を生みそうだし、Settledという言葉は馴染みがないので毎回書いてるが、より良い表現はないかどうか?

resolve または reject された時 という表現も使ってる。

どちらが主語になってるかの違いだけどどう統一しよう。


迷いそうな表記はCONTRIBUTIONファイルか何処かにまとめておく。

< IE 9とpromise.catch のバッティング

IE 10 IE 9未満では promise.catchと書くだけでシンタックスエラーになるというかなりキツイものがあるので、どこかでそれについて触れる必要がある。

.caught 等の回避エイリアスを用意してるライブラリもある。

この書籍としては、それは(今の)仕様に反しているので気にはしないけど、
現実的にはIE9はまだサポートから外してないケースが多いので、触れる必要があると考える。

  • どのタイミングで触れるべきか

セクションとして入れるほど書けることは無いけど、どこタイミングで書くのかが難しい…

promise chainについて

asyncThing1().then(function() {
  return asyncThing2();
}).then(function() {
  return asyncThing3();
}).catch(function(err) {
  return asyncRecovery1();
})

promise の処理を書くとメソッドチェーンをしてる事がわかる。

普通のメソッドチェーンとの違い(非同期のケースあんまりないからいいや)

ユーザーが触るAPIからはthenが見えなくて、内部的にpromiseを使うpromise chainの関数を定義するケースについて。

(promise chainという言葉は admc/wd#186 あたりからとっています)

  • ステートレスAPIのメソッドチェーン
  • promise chainならではのエラーハンドリング

書籍の目的について

#1 #12 と関連するが、

書籍の目的について最初に述べておくべきだと思う。

  • Promisesとはどういうものかを学び、パターンやテストを扱えるようになる事。
  • Promisesの向き不向きを知り、濫用しすぎない自制心を養う事。
  • 基本的な事からよくあるはまり所等を学び、より発展した形を自分で考えられるようになること

[Ch2] Promise.resolveとthenableの分離

Promise.resolve は第二章の先頭へ
(Promise.rejectも一緒に)

そして、ThenableとPromise.resolve はCh4へ移動する。

ThenableとPromise.resolveはいきなり難易度が上がりすぎてる感じがするのと、前後の章とあんまり関わりないので、後回しでもよさそう。

Ch2のPromise.resolveでも軽くThenableに触れてCh4へのリンクとする。

書籍のバージョン表示

電子書籍は更新継続性を持てるのが正しい姿なので、
読んでる書籍のバージョンがいくつなのかを表示できるようにする。

一番下に Last updated が出るけど、バージョン表示も合ったほうがコミット関連付けし易いと思う。

asciidoctor(1) | Asciidoctor

asciidoctor -a version=$ver

みたいな感じで値が渡せるので、package.jsonのバージョンと連動すればアップデートも気軽に出来ると思う。

書籍のタイトル

promises-bookはググらビリティが低いし、
promises なのか promiseで表記ゆれが発生しやすそう。

書籍内でもpromisesとpromiseが表記ゆれあるので(意識としてチャプタータイトルはs付ける感じでやってたけど)、Promiseに統一しちゃったほうが良い気がしてる。

タイトルとしては

  • Promiseという単語が入ってる

というのが最低条件。

被りそうな書籍的なものは多分、JavaScript with Promises - O'Reilly Mediaぐらいしか今後でなさそうなので、紛らわしくなければ良いと思う。

読者の想定レベル via #12 (comment)

既にJavaScript(not jQuery)を使ったことがある程度あって、
Good Parts or JavaScriptパターン or サイ本 or パーフェクトJavaScript辺りのどれかは読んだことある感じかなー。

ES5の機能も積極的に使ったことはなくても、存在は知ってるぐらいのレベルとなってる気がします。
普通の書籍に比べると若干高めな気がしますが、Promise以外については他のもので理解してくださいねというスタンスで書いてた気がします。(別に売り物じゃないので多少ハードル上げても問題ない)

`getURL`をもっと簡略化すべき

getURL のonloadをもっと簡略化するべきかどうか?

200だけみるの正確じゃないし、どうせなら、onloadとonerrorだけという分かりやすい区切りにした方がいい気がする。

https://github.com/azu/promises-book/blob/master/Ch1_WhatsPromises/src/xhr-promise.js
https://github.com/azu/promises-book/blob/master/Ch4_AdvancedPromises/src/xhr-deferred.js
https://github.com/azu/promises-book/blob/master/Ch4_AdvancedPromises/lib/cancelableXHR.js

またnew Error(req.statusText)というのも意味が分かりにくいので、
new Error("HTTP Error " + req.status + ": " + req.statusText);という感じにした方がいいかも?
(多分文中でも言及してる)

Promise.allとPromise.raceの組み合わせ

Promise.allPromise.raceを組み合わせて使うケース。

Distributed Electronic Rights in JavaScript
とか見て思いついた。

普通に書くと非同期処理をグループ分けてしてやるのは結構大変なので、
その辺をPromiseでまとめるとやりやすいしミスが減るというのを示せるとよいと思う。

  • 現実的にありそうな具体例

[PDF/Epub] 出力形式について

どのようなフォーマットで公開するかについて。

  • HTMLはデフォルト - Promises book
  • PDF はできればあったほうがよさそう
  • epub 面倒じゃなければあったほうがいい

当初の目的だと、PDFとかは任意の値段で購入できるようにして実験していたいというのがあった。
(お金 何か面倒だから自由にダウンロードできるようにしちゃいそうだけど)

Ch2 : 、で区切る。

URL : http://azu.github.io/promises-book/#ch2-promise.then

Promiseのメソッドチェーンだと長いので、今後はpromise chainと呼びますが、 このpromise chainがPromiseが非同期処理の流れを書きやすい理由の一つといえるかもしれません。

今後はpromise chainと呼びますが、

呼びます。 で一度区切ろう

Promise.sequenceを実装

promiseオブジェクトの配列を受け取って、それを一つづつ実行していくPromise.allの亜種的な実装について。

多分これを実装しようと思うと、 #9 について触れる必要があるはずなので、
#9 と一緒にまとめてしまう。

Promise.all とも内部的にPromise.resolveを通してるはず。

[Ch2] resolveの目的が小難しい

URL : http://azu.github.io/promises-book/#ch2-promise-reject

多くの場合は、多種多様なPromiseの実装ライブラリがある中でそれらの違いを意識せず使えるように、 共通の挙動であるthenだけを利用して、他の機能は自分自分のPromiseにあるものを利用できるように変換するという意味合いが強いと思います。

このthenableを変換する機能は、以前はPromise.castという名前であった事からも想像できるかもしれません。

様々なライブラリ間でpromiseを相互に変換して利用できる仕組み

という感じでもっと短く書こう

インライン埋め込みのサンプルコードのテスト

サンプルでも以下の2種類に分けられて書いてる。

  • ソースコード(主に関数定義等が中心)
  • ソースコードを実行する例を示すインラインコード

ソースコードの動作自体は、テストによってある程度保証されてるけど、
インラインコードはコピペで貼り付けてる部分があるので、これの動作を検証したい。

インラインコードも全部外部ファイルにして動かせるようにすればいいんだけど、中々大変な感じがする(インラインコードがソースコードに依存するケースが殆どなので)

[source,js]
----
インラインコード
----

という記法は間違いなく固定なので、このインラインコードをパースして、パース出来なければさすがにオカシイので、文法的なミスを検出するテストとか入れたい。
多分文法ミスによるエラーのサンプルは今のところなかったはず。
console.errror というようなtypoをした場合の例とかはありえそうだけど、これもJavaScriptの文法として間違ってないので、明らかな書きミスだけでも保証しておきたい。

必要なもの

  • Asciidocのパース
  • 取得したインラインコードをパースする(esprimaとか)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.