同期および非同期JavaScriptについて - パート1
同期 そして 非同期 特に初心者にとって、JavaScriptの概念を混乱させています。 2つ以上のことがあります 同期の 彼らはいつ 同時に起こる (同期して) そうでないときは非同期 (同期していません).
これらの定義は取り入れやすいですが、実際には見かけよりも複雑です。考慮に入れる必要があります 正確に同期しているもの, そして そうでないもの.
あなたはおそらく呼び出すと思います 普通の
JavaScriptの同期関数、そうでしょ?そしてそれが何かのようなものであれば setTimeout()
またはAJAXを使用しているのですが、それを非同期であると見なすでしょう。私があなたにそれを言うならばどうなりますか 両方 ある意味では非同期です?
説明する なぜ, 私たちはX氏に助けを求める必要があります.
シナリオ1 - X氏が同期を試みている
これがセットアップです:
- X氏は、難しい質問に答え、要求されたタスクを実行できる人です。.
- 彼と連絡を取る唯一の方法は、電話をかけることです。.
- それを実行するためにX氏の助けを求めるためにあなたが得たどんな質問や仕事でも。あなたは彼を呼ぶ.
- X氏があなたに答えを与えるか、あるいは仕事を完了させる 直ちに, そしてあなたに知らせる 完了しました.
- あなたは受信機感覚コンテンツを置き、映画に出かけます.
今行ったのは 同期(往復)通信 彼はあなたが彼にあなたの質問をしていると聞きました、そして彼がそれに答えているときあなたは聞きました.
シナリオ2 - X氏は共時性に満足していない
X氏は非常に効率的なので、彼はさらに多くの電話を受け始める。それであなたが彼に電話をするとどうなりますか 彼はもう忙しいです 他の人に話しかける?あなたが彼にあなたの質問をすることはできません - 彼があなたの電話を受けることが自由になるまではそうではありません。聞こえるのは話中音だけです.
だからX氏はこれと戦うために何ができるか?
直接電話を掛ける代わりに:
- X氏は新しい男M氏を雇い、彼に発信者のための留守番電話を渡します。 メッセージを残す.
- M氏の仕事は メッセージを渡す 留守番電話からX氏への連絡は、X氏が以前のすべてのメッセージの処理を完全に終了し、すでに 新しいものを自由に取ってください.
- それで、あなたが彼に電話をするとき、話中音を聞くのではなく、あなたは氏Xにメッセージを残すようになります、そして 彼があなたに電話をかけるのを待ちます (まだ映画はありません).
- X氏があなたの前に受け取ったキューに入れられたメッセージをすべて処理し終えたら、彼はあなたの問題を調べます。 折り返し電話をする あなたに答えを与えるために.
今ここに問題があります:それまでの行動は今まででしたか 同期または非同期?
それは混在しています。メッセージを残したとき, X氏はそれに耳を傾けていなかったので、4番目のコミュニケーションは非同期でした.
しかし、彼が答えたとき, 聞いていた, どっち 返信通信を同期させる.
これまでに、コミュニケーションに関してシンクロニシティがどのように認識されているのかについての理解を深めることができました。 JavaScriptを取り込む時間.
JavaScript - 非同期プログラミング言語
誰かがJavaScriptに非同期のラベルを付けるとき、彼らが一般的に言及しているのはあなたができる方法です。 伝言を残す それのために、そして 通話をブロックしない 忙しい口調で.
関数呼び出しは JavaScriptを指示しない, 文字通り行われている メッセージ経由.
JavaScriptは メッセージキュー 着信メッセージ(またはイベント)が保持されている場所。あ イベントループ (メッセージディスパッチャ)はそれらのメッセージを 呼び出しスタック 対応するメッセージの機能は次のとおりです。 フレームとして積み上げ 実行のための(関数の引数と変数).
呼び出しスタックは、呼び出されている最初の関数のフレームと、呼び出された関数のその他のフレームを保持します。 入れ子になった呼び出しを介して その上 .
メッセージがキューに参加すると、コールスタックが終了するまで待機します。 前のメッセージの全フレームが空, そしてそれがあるとき、イベントループ 前のメッセージをデキューする, 現在のメッセージの対応するフレームを呼び出しスタックに追加します.
呼び出しスタックが次のようになるまでメッセージは再び待機します 対応するフレームが空 (つまり、スタックされたすべての関数の実行が終了した)その後、デキューされます.
次のコードを見てください。
function foo()関数バー()foo();関数baz()bar(); baz();
実行されている機能は バズ()
(コードスニペットの最後の行) メッセージがキューに追加されます, そして、イベントループがそれを拾うと、呼び出しスタック フレームの積み重ねを開始 にとって バズ()
, バー()
, そして foo()
実行の関連する時点で.
関数の実行が1つずつ完了すると、それらのフレームは完成します。 呼び出しスタックから削除されました, メッセージが まだキューで待機中, まで バズ()
スタックからポップされます.
覚えておいて、関数呼び出しは JavaScriptを指示しない, 彼らはやった メッセージ経由. ですから、JavaScript自体が非同期プログラミング言語であると誰かが言うのを聞くときはいつでも、彼らはその組み込みについて話していると仮定してください “留守番電話”, そしてどのようにあなたがメッセージを残すことが自由であるか.
しかし、特定の非同期メソッドはどうでしょうか。?
これまでのところ、私はそのようなAPIに触れませんでした setTimeout()
とAJAX、それらはあるものです 特に非同期と呼ばれる. 何故ですか?
同期または非同期の内容を正確に理解することが重要です。 JavaScriptは、イベントとイベントループの助けを借りて、練習することができます メッセージの非同期処理, でもあの 意味ではありません すべてのもの JavaScriptでは非同期です.
覚えておいて、私はあなたにメッセージがコールスタックがなくなるまで残らなかったことを言った 対応するフレームが空です, 答えが出るまで映画に出かけなかったのと同じように - それは 同期している, あなたは待っています タスクが完了するまで, そしてあなたは答えを得ます.
待っている すべてのシナリオで理想的というわけではありません. メッセージを残した後で、待つのではなく、あなたが映画のために出ることができたらどうなりますか?関数がリタイア(コールスタックを空にする)でき、そのメッセージが関数のタスクが完了する前でもデキューできる場合はどうなりますか?コードを非同期的に実行できる場合?
これはどこのようなAPIです setTimeout()
そしてAJAXが登場します、そして彼らがしていることは…私たちがこの記事の後半で見ることになるX氏に戻ることなしにこれを説明することができないのです。乞うご期待.