課題
Webサイト読んでると、言葉がわけわからなくなり、疑問が乱発するので、メモです
- 「async/awaitで非同期処理にする」って、もともとJavascriptは非同期処理じゃん、とか。
- 「非同期処理=ブロック」って、非同期処理は順番通りにやらないことじゃないっけ、とか。
はじめに
Synchronous is defined as happening at the same time (in predictable timing, or in predictable ordering).
Asynchronous is defined as not happening at the same time. (with unpredictable timing or with unpredictable ordering).
同期的とは、予測可能なタイミングや順序で、行われること。
非同期的とは、同期的の反意後で、予測不可能なタイミングや準備で、行われること。
だから、ここでは、
同期処理とは、ユーザーにとって予測可能なタイミングで処理を行うこと
非同期処理とは、ユーザーにと
Javascriptは、上から順番に実行することは保証されず、非同期的に処理を行う。
また一方で、ブロック処理も行う。時間がかかる処理でメインスレッドが埋まり、
他の処理が並行して処理されない。(ある意味、矛盾しているように見える)
時間がかかる
本論
一方で、プログラミングを書く人間からすると、
ある処理を、正しく動作させるために、狙ったタイミングで、処理をしたい。(同期処理)
例えば、次の順番で処理をしたい。
A: トーストでパンを焼いて
→B: バターを塗って
→C: ジャムを塗る
ただ、条件があるのは、「Bのタスクは、PCが特にやることがないが時間がかかって、
PCがヒマになるようなタスク」(ブロック処理)であれば、
Bを待ってる間に、PCは他のことをしてほしい。(ノンブロック処理)
例えば、トーストで焼くのに時間がかかるときは、その間に皿洗いでもして欲しい。
A: トーストでパンを焼いて
→D: 皿を洗って
→B: バターを塗って
→C: ジャムを塗る
さらに、条件に欲をいうとすると、Bが終わったかどうかは、PCがちょこちょこ確認してしまうとする。
例えば、トーストと皿洗いの部屋が異なるとき、確認する時間分でロスが発生してしまう。
A: トーストでパンを焼いて
→D: 皿を洗って
→A': トーストを見に行って
→D: 皿を洗って
→A': トーストを見に行って
...
→A': トーストを取って
→B: バターを塗って
→C: ジャムを塗る
これは非効率なので、タスクB自身がPCに、「終わったよ」って伝えて欲しい。(★処理)
例えば、皿洗いの部屋まで聞こえるように、トーストは終了したらビープ音を鳴らせて、確認できるようにする。
A: トーストでパンを焼いて
→D: 皿を洗って(ビープ音が聞こえて中断して)
→A':トーストを取って
→B: バターを塗って
→C: ジャムを塗る
Javascriptでいう非同期処理
Javascriptでは、★処理のことを(なぜか)非同期処理と呼ぶ。
つまり、もともと非同期処理(順番が出鱈目)かつブロック処理(同時作業ができない)プログラミング言語だが、
そこで、あえて同期処理(順番通り)かつノンブロック処理(同時処理)を行っている。
これを、★処理と指していて、Javascriptでは、★処理のことを(なぜか)非同期処理と呼ぶ。
その★処理をおこなうマーカーが、Promiseや、async/await等となっている。
コールバック関数
上記の『タスクB自身がPCに「終わったよ」って伝えられる』タスクの場合、
その伝えてくれる機能のことを、「コールバック関数」という。
例えば、トーストが終了したときに鳴るビープ音
タスクB自身は、自分で時間がかかるものと自覚していると、
コールバック関数を設定できるものがある。setTimerなど。
例えば、レンジや炊飯器など、時間がかかるものは、お知らせする為の機能を設定できる。
ビープ音だったり、ライトだったり、スマホへ通知したり。これがコールバック関数にあたり、
レンジや炊飯器は、自身で時間がかかることがわかっているので、コールバック関数を
設定できるようにしてる。
Promiseの役割
順序制御処理 https://qiita.com/cheez921/items/41b744e4e002b966391a結論
非同期処理というと、プログラミング言語や状況でかなり変わるようで、一貫した定義はないよう。
その前提で、
Prosmiseやasync/awaitに対して、よく使われる「非同期処理」は、
「順序制御処理+コールバック関数」と考えた方がよさそう。
「同期処理」は、「非順序制御処理」と考えた方がよさそう。
※Javascriptで、非同期処理を、ノンブロック処理とイコールと説明するのは、
実態はほぼ同じなので、違和感はなかった。
参考
Promise
Promiseは、非同期処理(上で言う★処理)を実現するクラス。
なので、順序制御処理と、コールバック関数を持つ。
また、順序制御処理として、「then関数」と「catch関数」がある。
コールバック関数として、コンストラクタに、
非同期処理の実行中を表す「pending」、非同期処理が正常終了したことを表す「resolve」
異常終了したことを表す「reject」の三つがある。