ざっくり
とりあえず一通り読んでおけ枠
Promiseとasync/awaitをつなぐ枠
読んでおくと、「async functionはなんでPromiseを返すのか」とかわかるかもしれない。
- ES6のジェネレータを使った非同期プログラミング | NHN Cloud Meetup
- async/await以前にあったラッパー記法・ラッパーライブラリを使った書き方の紹介
- ハンズオンNode.js - O'Reilly Japan
- Promise→async/awaitの説明のために明確にジェネレーターとPromiseを組み合わせる話をする
- n月刊ラムダノート Vol.1, No.1(2019) – 技術書出版と販売のラムダノート
- 「本来の意味と違うがコルーチンと呼ばれるもの」の一つとしてasync/await以前の話が出てくる
- NHN Cloudの記事にでてきたcoあたりがたぶん誤用の代表格?
- 「本来の意味と違うがコルーチンと呼ばれるもの」の一つとしてasync/await以前の話が出てくる
ざっくり歴史・経緯(私見)
- 処理とUIでスレッドが分かれていないので、外部に依頼を投げて外部からの結果待ちをするときにUIのイベントをブロックしないために非同期処理を使う必要があった
- 特に工夫のない非同期処理では後続処理やエラー処理を行うために引数に関数を渡す方式(コールバック方式)が使われていた
- コールバック関数には人類には難しすぎるなど色々課題があったのでPromiseが導入された。また同タイミングでgeneratorも導入された
- Promiseも人類にはまだまだ難しい書き方であったので、generatorと組み合わせて同期的な書き方に近い表現を実現する方法が提案されていた(coなど、通称:コルーチン、イディオム)
- コルーチン、イディオムが正式にasync/awaitとして採用された
蛇足
私の現状ざっくり理解
- Promiseは非同期処理の実行状況やコールバック関数を見通しよく書くためのもの
- Promise自体は非同期処理じゃない
- 非同期処理は「○○さん、これやっといて!自分はほかにやることあるから、あとよろしく!」とだいたい同じ
- 非同期処理のあとに後続処理をやるためにコールバック関数を設定することは「○○さん、これやっといて!終わったら声かけて!」とだいたい同じ
- 非同期処理におけるcallback hellは「○○さん、これやっといて!終わったら出来上がったものをこの形式にまとめて!まとめなおしたものを××さんに渡して△△してもらって!△△してもらったら声かけて!」とだいたい同じ