@@ -104,7 +104,7 @@ taskB();
104104## 非同期処理はメインスレッドで実行される {#async-and-main-thread}
105105
106106メインスレッドはUIスレッドとも呼ばれ、重たいJavaScriptの同期処理はメインスレッドで実行する他の処理(画面の更新など)をブロックする問題について紹介しました。
107- これは非同期処理においても同様の問題があります。なぜならJavaScriptにおける非同期の大部分はメインスレッドで実行されるためです 。
107+ これは非同期処理においても同様の問題があります。なぜならJavaScriptにおける非同期処理の大部分はメインスレッドで実行されるためです 。
108108
109109非同期処理は名前から考えるとメインスレッド以外で実行されるように見えますが、
110110基本的には非同期処理も同期処理と同じようにメインスレッドで実行されます。
@@ -153,12 +153,12 @@ taskB();
153153しかし、実際にはこの非同期処理もメインスレッドで実行された同期的にブロックする処理の影響を受けます。
154154
155155多くの環境では、このときの非同期処理のコールバック関数が呼ばれるまでは1秒以上かかります。
156- これは、10ミリ秒後に非同期のコールバック関数を実行するようにタイマーへ登録自体はできていますが、同期的なブロックする処理によって非同期のタスクの実行も後ろにずれてしまうためです 。
156+ これは、10ミリ秒後に非同期のコールバック関数を実行するようにタイマーへ登録自体はできていますが、同期的にブロックする処理によって非同期のタスクの実行も後ろにずれてしまうためです 。
157157このように** 非同期処理** も** 同期処理** の影響を受けることから、同じメインスレッドで実行されていることがわかります。
158158
159159![ 非同期処理とブロックする同期処理] ( ./img/block--async-single-thread-tasks.png )
160160
161- JavaScriptでは一部の例外を除き非同期処理が** 並行処理(concurrent )** として扱われます。
161+ JavaScriptでは一部の例外を除き非同期処理が** 並行処理(Concurrent )** として扱われます。
162162並行処理とは、処理を一定の単位ごとに分けて処理を切り替えながら実行することです。
163163そのため非同期処理の実行前にとても重たい処理があると、非同期処理の実行が遅れるという現象を引き起こします。
164164
@@ -172,7 +172,7 @@ Web Workerではメインスレッドとは異なるWorkerスレッドで実行
172172そのため、重たい処理をWorkerに移動できるというメリットはありますが、メインスレッドとWorkerスレッドのデータのやり取りに制限があるというトレードオフの関係になります。
173173
174174このように、非同期処理のすべてをひとくくりにはできませんが、基本的な非同期処理(タイマーなど)はメインスレッドで実行されているという性質を知ることは大切です。JavaScriptの大部分の** 非同期処理** は** 非同期的なタイミングで実行される処理** であると理解しておく必要があります。
175- この書籍で紹介する非同期処理のほとんどは、メインスレッドで処理を切り替えながら実行する** 並行処理(concurrent )** となっています。
175+ この書籍で紹介する非同期処理のほとんどは、メインスレッドで処理を切り替えながら実行する** 並行処理(Concurrent )** となっています。
176176
177177## 非同期処理と例外処理 {#async-processing-and-error-handling}
178178
@@ -1583,7 +1583,7 @@ Async Function外の処理も停止できてしまうと、JavaScriptでは基
15831583先ほどの` fetchResources ` 関数ではforループと` await ` 式を利用していました。
15841584このときにforループの代わりにArrayの` forEach ` メソッドは利用できません。
15851585
1586- 単純に` fetchResources ` 関数のforループから` Array ` の` forEach ` メソッドに書き換えて見ると 、構文エラー(` SyntaxError ` )が発生してしまいます。
1586+ 単純に` fetchResources ` 関数のforループから` Array ` の` forEach ` メソッドに書き換えてみると 、構文エラー(` SyntaxError ` )が発生してしまいます。
15871587これは` await ` 式がAsync Functionの中でのみ利用ができる構文であるためです。
15881588
15891589<!-- textlint-disable -->
@@ -1692,7 +1692,7 @@ fetchResources(resources).then((results) => {
16921692### [ ES2022] Module直下での` await ` 式 {#top-level-await-in-module}
16931693
16941694ES2021までは、` await ` 式はAsync Functionの直下でのみ利用可能なことを紹介しました。
1695- ES2022には 、これに加えてModuleの直下ではAsync Functionで囲まなくても` await ` 式が利用できます。
1695+ ES2022では 、これに加えてModuleの直下ではAsync Functionで囲まなくても` await ` 式が利用できます。
16961696
16971697最初に「[ JavaScriptとは] [ ] 」の章において、JavaScriptには実行コンテキストとして"Script"と"Module"があるという話をしました。
16981698たとえば、ブラウザでは` <script> ` と書けば"Script"として実行され、` <script type="module"> ` と書けば"Module"として実行されます。
@@ -1714,7 +1714,7 @@ await new Promise(resolve => setTimeout(resolve, 1000));
17141714console .log (` 実行終了: ${ Date .now () - startTime} ms 経過しました` );
17151715```
17161716
1717- このようにModuleではトップレベルにおいて ` await ` 式が利用できることは、Top-Level ` await ` と呼ばれます。
1717+ このようにModuleのトップレベルにおいて ` await ` 式が利用できることは、Top-Level ` await ` と呼ばれます。
17181718
17191719ES2021まではAsync Functionの直下のみでしか` await ` 式が利用できませんでした。
17201720そのため、メイン処理のように他の処理を呼び出すスクリプトの開始地点で` await ` を使いたい場合は、Async Functionを使った即時実行関数で` await ` を囲むケースがありました。
0 commit comments