Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

非同期処理(async): Promise #94

Closed
4 tasks done
azu opened this issue Jul 19, 2016 · 20 comments
Closed
4 tasks done

非同期処理(async): Promise #94

azu opened this issue Jul 19, 2016 · 20 comments
Assignees

Comments

@azu
Copy link
Collaborator

azu commented Jul 19, 2016

#17 基本文法

Edit(2018-06-25): 当初の予定ではPromiseだけだったが、非同期処理全般の流れになっている。

try...catch文 #93 -> エラーハンドリング -> 非同期という流れでPromise。

詳細はJavaScript Promiseの本を見てって感じにした方が良さそうな気もする。
#9 AjaxのユースケースでPromiseが出てくるので、ここで出てくる文法をカバーするように書く。

目的

  • JavaScriptの非同期処理についてを理解する
  • JavaScriptでの非同期処理の重要性について説明する
  • JavaScriptの非同期処理と例外処理についてを見ていく

アウトライン

タスク

@lacolaco
Copy link
Collaborator

Ajaxユースケース側で使うのは 標準のコンストラクタと、thencatchくらいですね。 .resolve.rejectとか、.allは使う予定はないです

@azu
Copy link
Collaborator Author

azu commented Aug 7, 2016

thenは次のthen(のコールバック)へ値を渡すという表現 #116

@azu
Copy link
Collaborator Author

azu commented Feb 1, 2018

Promiseのところでasync awaitのユースケースの紹介を簡単に。

@azu
Copy link
Collaborator Author

azu commented Jun 17, 2018

  • 非同期処理とは
  • コールバックでの非同期
    • try-catchできない
try{
  fn(callback);
}catch(error){
}
  • Nodeスタイルのエラーキャッチ
    • 処理内でエラーが起きた場合にコールバックにどう伝えるかという
    • Promise
  • イベント
  • 非同期は非同期に統一
  • new Promise
  • Promise.resolve
  • Promise.reject
  • Promise#then
  • Promise#catch
  • Promise#finally
  • promiseオブジェクト
  • Promise.all
  • Promise.race
  • async function
    • 常にpromiseオブジェクトを返す
    • await operator

という感じになるかな。

非同期処理と同期処理の大きな違いは、非同期処理は実行時になにか起きるかということで処理を書くから、コードを見ただけではわかりにくい問題がありそう。
非同期処理とtry-catchのエラーハンドリングの難しさを先にしないと、Promiseの説明に入れないという問題に気づいた。

https://asciidwango.github.io/js-primer/basic/error-try-catch/

@azu
Copy link
Collaborator Author

azu commented Jun 17, 2018

例外処理

@azu
Copy link
Collaborator Author

azu commented Jun 17, 2018

  • 非同期処理とエラーハンドリング
  • Promise

という大きく分けた感じ。

非同期処理とエラーハンドリング

これをtry-catchの方に入れるか、Promiseの方にいれるかって難しいな。
try-catchの話で、ネストした場合にcatchした時点でエラーの伝播は止まるよって話はほしいかも。

@azu
Copy link
Collaborator Author

azu commented Jun 17, 2018

@yumetodo
Copy link
Contributor

例外処理側でコールバックの例外問題を提起しておいて、Promise側ではこれだったら解決できる、とサックリ流すのが流れ的に良いのではないでしょうか?

@azu
Copy link
Collaborator Author

azu commented Jun 18, 2018

全体的な流れのイメージ

  • 同期エラーはスコープチェインのように伝播する
  • try-catchで止めれば、それ以上伝播しない
  • 非同期エラーは実行コンテキストが異なるため伝播しない
    • コールバック内でtry-catchしないといけない
  • 非同期エラーを伝播させる技術としてエラーファーストコールバック *A
  • エラーファーストコールバックはNode.jsで発展した
  • (省略) Promise/A+
  • ES2015 Promise
  • Promiseは非同期処理の成功と失敗の統一的なインタフェースを提供するビルトインオブジェクト *A
  • エラーファーストコールバックはあくまで規約だったものをオブジェクトとしてパターン化した
  • 非同期には、直列、並列的な表現などさまざまパターンがある
  • => 詳細なパターンについてはPromise本を参照
  • Promiseにおいてエラーは暗黙的に伝播し、明示的に伝播させる場合にはrejectを行う
  • Async/Await
  • Promiseはあくまでオブジェクトでそれを構文として表現したのがasync/await
    • 反例がないかは要調査
  • async functionは常にPromiseオブジェクトを返し、async functionにおいてはawait式が利用できる
  • await式はPromiseがsettleとなるまで待ち、その実行結果を現在の実行コンテキストへと返すもの
    • Completionによって結果を伝えてる
  • この時にエラーも伝播ができるため、try-catchで同期処理と同じように例外をキャッチできる *A

*Aは同じコード例の別表現の例示

@azu
Copy link
Collaborator Author

azu commented Jun 18, 2018

非同期処理はできるけど、JavaScriptが実行される環境は基本的にシングルスレッドですよって話を簡潔にしたい感じはする。(多分スレッドという概念を出すと難しすぎるから、交互に処理が動いているという簡単なイメージが通じるといいのだけど)
setTimeoutのような非同期処理と呼ばれてるものが他の処理の影響を受けて遅れるということを体感してもらうのがいいのかな。

PromiseってよりはJavaScriptにおける非同期って何かという概念を理解できたほうがいい気がするな。
Promiseとかは便利なAPIって感じだし。

ただ分量が難しい

@azu
Copy link
Collaborator Author

azu commented Jun 20, 2018

@azu azu changed the title Promise 非同期処理: Promise Jun 25, 2018
@azu azu changed the title 非同期処理: Promise 非同期処理(async): Promise Jun 29, 2018
@azu
Copy link
Collaborator Author

azu commented Jun 30, 2018

The Node.js Way - Understanding Error-First Callbacks
エラーファーストコールバックについての定義

@azu
Copy link
Collaborator Author

azu commented Jul 26, 2018

Async Functionについて

  • thenの直列処理awaitで書く
  • 並列をpromise.allする例
  • コールバック関数にはasyncをつけないといけない、関数に閉じてるよという説明
  • エラーハンドリング
  • return or awaitについて

#525 で話した

@azu
Copy link
Collaborator Author

azu commented Jul 30, 2018

@azu
Copy link
Collaborator Author

azu commented Sep 3, 2018

非同期処理 // => 期待評価値 がうまく動いてない気がするので、サンプルコードはちゃんとチェックする必要がありそう

@azu
Copy link
Collaborator Author

azu commented Oct 15, 2018

async と callback
Async ... await in Javascript

@azu
Copy link
Collaborator Author

azu commented Oct 15, 2018

#539
doctestがpromiseが混ざると動いてない感じがする。
vm モジュールでunhandled rejectionとかはどうやってcatchすればいいんだろ?

@azu
Copy link
Collaborator Author

azu commented Oct 20, 2018

#536 で合わせてdoctestも修正入れた

@azu azu closed this as completed in #536 Oct 20, 2018
@azu
Copy link
Collaborator Author

azu commented Oct 20, 2018

https://asciidwango.github.io/js-primer/basic/async/
ひとまず完成。
JobQueue周りの話はおかしいので中途半端だしうまく削りたい

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants