-
-
Notifications
You must be signed in to change notification settings - Fork 224
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
feat(async): 同期処理と非同期処理 #503
Conversation
Deploy preview for js-primer ready! Built with commit 2a75dcb |
#94 を更新して大雑把な分類をつけた。
|
source/basic/async/README.md
Outdated
// 重たい処理の例として10の6乗コの要素を持つ配列を0に初期化し返す | ||
function createLargeArray() { | ||
console.log("重たい処理を実行します"); | ||
return new Array(10e6).fill(0); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
この重たい処理をブラウザを固めない程度で、実行環境にばらつきがない感じのいい感じのやつないかなー
10e6 意外一瞬で終わる…
10e7だとおもすぎる
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
0以外でfillするとかフィボナッチ数列をつくるとか
source/basic/async/README.md
Outdated
``` | ||
|
||
同期処理は直感的な処理順ですが、このような重たい処理や終わるかわからない処理がある場合に問題となります。 | ||
特にブラウザにおいては、このような重たい同期処理はブラウザの体感への悪影響を与えるため問題となりやすいです。 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
このような重たい
このようなを連呼シすぎている
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
悪影響を与えるため問題となりやすいです。
悪影響を与えるためです。
source/basic/async/README.md
Outdated
|
||
基本的には非同期処理も同期処理と同じようにメインスレッドで実行されます。 | ||
非同期処理は名前から考えるとメインスレッド以外で実行されるように見えますが、 | ||
非同期処理がどのようにメインスレッドで実行されているかを簡潔に見ていきます。 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
なんかここの流れが無理やりな感じ
source/basic/async/README.md
Outdated
また、`setTimeout`関数でタイマーに登録した次の行で重たい処理を実行しています。 | ||
|
||
`setTimeout`関数による非同期処理がメインスレッドとは異なるスレッドで実行されてるならば、 | ||
コールバック関数はメインスレッドの重たい処理の影響は受けないはずです。 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ほとんど受けない?ぐらいにしておく?
source/basic/async/README.md
Outdated
|
||
`setTimeout`関数による非同期処理がメインスレッドとは異なるスレッドで実行されてるならば、 | ||
コールバック関数はメインスレッドの重たい処理の影響は受けないはずです。 | ||
しかし、実際にはメインスレッドの重たいの影響を受けるため、タイマーに登録した時間より遅れて非同期でコールバック関数が呼び出されます。 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
重たいの影響を
処理が抜けている
source/basic/async/README.md
Outdated
|
||
JavaScriptでは一部の例外を除き非同期処理が**平行(concurrent)**して処理されます。 | ||
|
||
ECMAScriptの仕様では**JobQueue**と呼ばれるキューで次の行うタスクが管理されています。 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
次に行う
source/basic/async/README.md
Outdated
ECMAScriptの仕様では**JobQueue**と呼ばれるキューで次の行うタスクが管理されています。 | ||
次に処理するタスクをキューから1つ取り出し、タスクの処理が終わったら次のタスクを取り出りだすというのを繰り返してプログラムを評価しています。 | ||
|
||
同期処理では、キューにタスクを追加せずに、次々と処理するということを繰り返しています。 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
次々と処理するということを繰り返しています。
現在ある処理を次々と処理しています。
source/basic/async/README.md
Outdated
これによって、非同期処理のタスクが重たい同期の処理によって実行が遅れるという現象を引き起こします。 | ||
そのためJavaScriptの非同期処理も基本的には1つのメインスレッドで処理されていると考えても間違いよいでしょう。 | ||
|
||
ただし、非同期処理の中にも例外的にメインスレッドとは別のスレッドで実行できるAPIが実行環境で提供されている場合があります。 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
冗長な感じ
source/basic/async/README.md
Outdated
そのためJavaScriptの非同期処理も基本的には1つのメインスレッドで処理されていると考えても間違いよいでしょう。 | ||
|
||
ただし、非同期処理の中にも例外的にメインスレッドとは別のスレッドで実行できるAPIが実行環境で提供されている場合があります。 | ||
たとえばブラウザでは[Web Worker][] APIはメインスレッド以外でJavaScriptを実行できため、非同期処理を**並列(Parallel)**に処理できます。 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
[Web Worker][] APIはメインスレッド以外でJavaScriptを実行できため
[Web Worker][] APIを使いメインスレッド以外でJavaScriptを実行できため
source/basic/async/README.md
Outdated
console.log("この文は実行されます"); | ||
``` | ||
|
||
コード的には`try`ブロックの中で、`setTimeout`関数によってタイマーへコールバック関数が登録されます。 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ここ1行減らせそう
source/basic/async/README.md
Outdated
|
||
このような非同期処理では、setTimeoutの内側の例外をキャッチできますが、setTimeoutの外側からは例外は発生したかわかりません。 | ||
|
||
JavaScriptでは、この非同期処理と例外処理を扱う方法としてさまざまなパターンが存在しています。 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
この非同期処理と例外処理
この非同期処理での例外処理を扱
source/basic/async/README.md
Outdated
// 重たい処理の例として10の6乗コの要素を持つ配列を0に初期化し返す | ||
function createLargeArray() { | ||
console.log("重たい処理を実行します"); | ||
return new Array(10e6).fill(0); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
0以外でfillするとかフィボナッチ数列をつくるとか
source/basic/async/README.md
Outdated
しかし、`createLargeArray`関数は1000万回の`0`を代入するという重たい処理です。(実際にどの程度が重たいかは実行する端末の性能で変化します) | ||
そのため、`createLargeArray`関数を呼び出すとその処理が完了するまで、次の処理(次の行)が呼ばれません。 | ||
次のコードの`doHeavyTask`関数では1000万回の`0`を代入するという**重たい処理**を意図的に行っています。(実際にどの程度が重たいかは実行する端末の性能で変化します)そのため、`doHeavyTask`関数を呼び出すとその処理が完了するまで、次の処理(次の行)が呼ばれません。 | ||
`Date.now`メソッドで時間を取得し、**重たい処理**がどの程度処理をブロッキングしているかを計測しています。 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
何のために計測するかボケている気がします
source/basic/async/README.md
Outdated
しかし、`createLargeArray`関数は1000万回の`0`を代入するという重たい処理です。(実際にどの程度が重たいかは実行する端末の性能で変化します) | ||
そのため、`createLargeArray`関数を呼び出すとその処理が完了するまで、次の処理(次の行)が呼ばれません。 | ||
次のコードの`doHeavyTask`関数では1000万回の`0`を代入するという**重たい処理**を意図的に行っています。(実際にどの程度が重たいかは実行する端末の性能で変化します)そのため、`doHeavyTask`関数を呼び出すとその処理が完了するまで、次の処理(次の行)が呼ばれません。 | ||
`Date.now`メソッドで時間を取得し、**重たい処理**がどの程度処理をブロッキングしているかを計測しています。 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
何のために計測するかボケている気がします
重たい処理じゃなくて |
"重たい処理" を "同期的にブロックする処理" とするようにして、実装もsleep関数みたいなのにした。 |
#94