Javascriptにおける非同期処理という呼び方が覚えづらい

<h3>課題</h3>

Webサイト読んでると、言葉がわけわからなくなり、疑問が乱発するので、メモです
- 「async/awaitで非同期処理にする」って、もともとJavascriptは非同期処理じゃん、とか。
- 「非同期処理＝ブロック」って、非同期処理は順番通りにやらないことじゃないっけ、とか。

<h3>はじめに</h3>

> 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は、上から順番に実行することは保証されず、非同期的に処理を行う。
また一方で、ブロック処理も行う。時間がかかる処理でメインスレッドが埋まり、
他の処理が並行して処理されない。（ある意味、矛盾しているように見える）

時間がかかる

<h3>本論</h3>

一方で、プログラミングを書く人間からすると、
ある処理を、正しく動作させるために、狙ったタイミングで、処理をしたい。（同期処理）
例えば、次の順番で処理をしたい。
　　　　　　　　　　　　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: ジャムを塗る

<h3>Javascriptでいう非同期処理</h3>

Javascriptでは、★処理のことを（なぜか）非同期処理と呼ぶ。

つまり、もともと非同期処理（順番が出鱈目）かつブロック処理（同時作業ができない）プログラミング言語だが、
そこで、あえて同期処理（順番通り）かつノンブロック処理（同時処理）を行っている。
これを、★処理と指していて、Javascriptでは、★処理のことを（なぜか）非同期処理と呼ぶ。

その★処理をおこなうマーカーが、Promiseや、async/await等となっている。

<h3>コールバック関数</h3>

上記の『タスクB自身がPCに「終わったよ」って伝えられる』タスクの場合、
その伝えてくれる機能のことを、「コールバック関数」という。
　例えば、トーストが終了したときに鳴るビープ音

タスクB自身は、自分で時間がかかるものと自覚していると、
コールバック関数を設定できるものがある。setTimerなど。
　例えば、レンジや炊飯器など、時間がかかるものは、お知らせする為の機能を設定できる。
　ビープ音だったり、ライトだったり、スマホへ通知したり。これがコールバック関数にあたり、
　レンジや炊飯器は、自身で時間がかかることがわかっているので、コールバック関数を
　設定できるようにしてる。

<h3>Promiseの役割</h3>
順序制御処理
https://qiita.com/cheez921/items/41b744e4e002b966391a

<h3>結論</h3>

非同期処理というと、プログラミング言語や状況でかなり変わるようで、一貫した定義はないよう。
その前提で、

Prosmiseやasync/awaitに対して、よく使われる「非同期処理」は、
「順序制御処理＋コールバック関数」と考えた方がよさそう。
「同期処理」は、「非順序制御処理」と考えた方がよさそう。

※Javascriptで、非同期処理を、ノンブロック処理とイコールと説明するのは、
　　実態はほぼ同じなので、違和感はなかった。

<h3>参考</h3>

https://liginc.co.jp/344056

https://stackoverflow.com/questions/2625493/asynchronous-and-non-blocking-calls-also-between-blocking-and-synchronous

https://rainbow-engine.com/javascript-ajax-process-order/

https://apricot-design.com/staffblog/javascript%E3%81%AE%E5%90%8C%E6%9C%9F%E5%87%A6%E7%90%86%E3%81%A8%E9%9D%9E%E5%90%8C%E6%9C%9F%E5%87%A6%E7%90%86%E3%82%92%E3%82%84%E3%81%95%E3%81%97%E3%81%8F%E8%A7%A3%E8%AA%AC%E3%81%97%E3%81%BE%E3%81%99/#:~:text=JavaScript%E3%81%AF%E5%90%8C%E6%9C%9F%E5%87%A6%E7%90%86%E3%81%A7%E3%81%82%E3%82%8A%E3%80%81%E9%9D%9E%E5%90%8C%E6%9C%9F%E5%87%A6%E7%90%86%E3%81%A7%E3%81%82%E3%82%8B,-JavaScript%E3%81%AF%E5%90%8C%E6%9C%9F&text=JavaScript%E3%81%AF%E8%A8%98%E8%BF%B0%E3%81%97%E3%81%9F%E9%A0%86%E7%95%AA,%E3%81%AE%E3%81%A7%E5%90%8C%E6%9C%9F%E5%87%A6%E7%90%86%E3%81%A8%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82


<h3>Promise</h3>

Promiseは、非同期処理（上で言う★処理）を実現するクラス。
なので、順序制御処理と、コールバック関数を持つ。

また、順序制御処理として、「then関数」と「catch関数」がある。

コールバック関数として、コンストラクタに、
非同期処理の実行中を表す「pending」、非同期処理が正常終了したことを表す「resolve」
異常終了したことを表す「reject」の三つがある。



<h3>参考</h3>
https://zenn.dev/tentel/articles/8146043d1101b5ea873d