Skip to content

Commit

Permalink
fix(async): まとめを変更
Browse files Browse the repository at this point in the history
  • Loading branch information
azu committed Jun 25, 2018
1 parent c85c483 commit 23b220a
Showing 1 changed file with 13 additions and 10 deletions.
23 changes: 13 additions & 10 deletions source/basic/async/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -120,26 +120,27 @@ console.log("重たい同期処理を実行しました");
どの程度遅れるかは実行している端末にもよりますが、MacBook Pro 2017モデルでは、非同期処理のコールバックが呼ばれるまで1500ミリ秒かかりました。
このように**非同期処理****同期処理**の影響を受けることからも同じスレッドで実行されていることがわかります。

JavaScriptでは多くの非同期処理が**平行(concurrent)**して処理されます。
ECMAScriptの仕様ではJobQueueと呼ばれるキューで次の行うタスクが管理されています。
JavaScriptでは一部の例外を除き非同期処理が**平行(concurrent)**して処理されます。

ECMAScriptの仕様では**JobQueue**と呼ばれるキューで次の行うタスクが管理されています。
次に処理するタスクをキューから1つ取り出し、タスクの処理が終わったら次のタスクを取り出りだすというのを繰り返してプログラムを評価しています。

同期処理では、キューにタスクを追加して、すぐにキューからタスクを取り出して処理するということを繰り返しています
同期処理では、キューにタスクを追加せずに、次々と処理するということを繰り返しています

- [ ] 同期処理のキューの図

一方の非同期処理では、キューのタスクを追加だけして、キューからタスクを取り出して実行するのは非同期で処理します。
`setTimeout`関数でタスク(コールバック関数)をキューへ追加し、指定時間後にタスクを取り出して処理します(コールバック関数を呼び出す)。
その非同期のタスクを取り出す前に別の同期的な重たい処理がある場合は、重たい処理が終わるまで非同期のタスクを取り出して実行(コールバック関数を実行)できなくなるというわけです
キューへ追加した非同期のタスクを取り出す前に同期的な重たい処理がある場合は、重たい処理が終わってから非同期のタスクを取り出して実行(コールバック関数を実行)しています

- [ ] 非同期処理のキューの図

同期処理と非同期処理がどちらも同じキュー上で管理されるため、実行順は異なりますがどちらも処理が終わるまで待つという影響を受けます
そのため「JavaScriptはシングルスレッドで処理されている」と言われることがあります
これによって、非同期処理のタスクが重たい同期の処理によって実行が遅れるという現象を引き起こします
そのためJavaScriptの非同期処理も基本的には1つのメインスレッドで処理されていると考えても間違いよいでしょう

非同期処理の中にも例外的にメインスレッドとは別のスレッドで実行できるAPIが実行環境で提供されている場合があります。
ブラウザでは[Web Worker][] APIはメインスレッドではないところでJavaScriptを実行できため、非同期処理を**並列(Parallel)**に処理できます。
このように、非同期処理ですべてをひとくくりにはできませんが、基本的な非同期処理(タイマーなど)はメインスレッドで実行されているという性質を知ることは大切です。
ただし、非同期処理の中にも例外的にメインスレッドとは別のスレッドで実行できるAPIが実行環境で提供されている場合があります。
たとえばブラウザでは[Web Worker][] APIはメインスレッド以外でJavaScriptを実行できため、非同期処理を**並列(Parallel)**に処理できます。
このように、非同期処理のすべてをひとくくりにはできませんが、基本的な非同期処理(タイマーなど)はメインスレッドで実行されているという性質を知ることは大切です。

## 非同期処理と例外処理 {#async-processing-and-error-handling}

Expand Down Expand Up @@ -204,7 +205,9 @@ console.log("この文は実行されます");
このような非同期処理では、setTimeoutの内側の例外をキャッチできますが、setTimeoutの外側からは例外は発生したかわかりません。

JavaScriptでは、この非同期処理と例外処理を扱う方法としてさまざまなパターンが存在しています。
次の章では、そのパターンとしてエラーファーストコールバック、Promise、Async Functionについてを見ていきます。
この章では非同期のパターンとしてエラーファーストコールバック、Promise、Async Functionの3つについてを見ていきます。
現実のコードではすべてのパターンが実用的です。そのため、非同期処理の選択肢を増やす意味でも理解することは重要です。


[文と式]: ../statement-expression/README.md
[例外処理]: ../error-try-catch/README.md
Expand Down

0 comments on commit 23b220a

Please sign in to comment.