ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScript における同期と非同期の違いの概要

JavaScript における同期と非同期の違いの概要

不言
不言転載
2019-01-24 09:57:564959ブラウズ

この記事では、JavaScript における同期と非同期の違いについて説明します。必要な方は参考にしていただければ幸いです。

JavaScript 言語は「シングルスレッド」言語です。
Java 言語とは異なり、クラスは Thread を継承し、thread.start を使用してスレッドを開きます。
つまり、JavaScript は組み立てラインのようなもので、処理またはパッケージ化の単なる組み立てラインであり、複数のタスクやプロセスを同時に実行することはできません。

「同期性」 - 人々は「一緒に」という言葉をすぐに思い出します。

「非同期」は、文字通り、何かが異なる (異なる) 方法で行われるようです。頭に浮かぶ単語は「ながら…しながら…」です。たとえば、「シャオミンはアイスクリームを食べながら同時に宿題をしています。」 アイスクリームを食べた後でも、これはまったく問題ありません。 、彼も非同期で宿題を終えましたか?それは大きな間違いです!

実際には、同期であっても非同期であっても、
何にせよ、物事を行うときは 1 つのパイプライン (シングル スレッド) しかありません
同期 非同期との違いは、このパイプライン上の各プロセスの実行順序が異なることです。

最も基本的な非同期関数は setTimeout 関数と setInterval 関数です。

これらは非常に一般的ですが、これが実際に非同期であることを知っている人はほとんどいません。これは、これらの関数は実行順序を制御できるためです。 js.これを単純に次のように理解することもできます。
プログラムの通常の実行シーケンスを変更できる操作は、非同期操作と見なすことができます。次のコード:

    console.log( "1" );
    setTimeout(function() {
        console.log( "2" )
    }, 0 );
    setTimeout(function() {
        console.log( "3" )
    }, 0 );
    setTimeout(function() {
        console.log( "4" )
    }, 0 );
    console.log( "5" );

出力順序は何ですか?

JavaScript における同期と非同期の違いの概要setTimeout(function, time) の待ち時間を 0 に設定していますが、その中の関数は依然として後で実行されていることがわかります。

setTimeout の遅延時間は 0 ですが、

関数もキューに入れられ、次の実行機会を待ちます。

現在のコード (実行されない関数を参照)をキュー プログラムに追加する必要があります) は、キューのプログラムが完了する前に完了する必要があるため、結果は期待どおりにならない可能性があります。


ここでは「キュー」(つまり、タスクキュー) について説明します。

このキューに配置されるのは、setTimeout の関数です。 are in sequence キューに参加します。 つまり、キュー内のすべての関数のプログラムは、キューの外にあるすべてのコードが実行された後に実行されます。 これはなぜですか?プログラムを実行するとき、ブラウザーは時間のかかるプログラムとして setTimeout や ajax リクエストなどのメソッドをデフォルトで使用するためです (時間はかからない場合もありますが)
それらをキューに追加すると、ストレージに時間がかかります。プロセス: プログラムのキュー。時間のかからないプログラムがすべて実行された後、キュー内のプログラムが順番に実行されます。

元の出発点に戻ります。JavaScript はシングルスレッドです。シングルスレッドとは、すべてのタスクをキューに入れる必要があり、前のタスクが完了するまで次のタスクは実行されないことを意味します。
前のタスクに時間がかかると、次のタスクも待たされることになります。

つまり、タスクキューという概念があります。大量の計算によってキューが発生し、CPU がビジー状態になる場合は、そのことを忘れてください。
しかし、多くの場合、IO デバイス (入出力デバイス) が非常に遅いため (Ajax 操作の読み取りなど)、CPU はアイドル状態になります。ネットワークからのデータ) ですが、
続行する前に結果が出るまで待つ必要があります。そこで、JavaScript 言語の設計者は、現時点では、メインスレッドが IO デバイスを完全に無視し、待機中のタスクを
一時停止し、キュー内のタスクを最初に実行できることに気付きました。 IO デバイスが結果を返すまで待ってから、戻って中断されたタスクの実行を続行します。


したがって、すべてのタスクは 2 つのタイプに分類できます。

1 つは同期タスク (synchronous)、もう 1 つは非同期タスク (asynchronous) です。同期タスクとは、メイン スレッドで実行するためにキューに入れられたタスクを指します。

次のタスクは、前のタスクが実行された後にのみ実行できます。非同期タスクは、メイン スレッドには入らないが「タスク キュー」に入るタスクを指します。 (タスク キュー).キュー) タスク、

メイン スレッドのタスクが完了し、「タスク キュー」がメイン スレッドに通知してタスクの実行を要求し始めた場合にのみ、タスクは実行のためにメイン スレッドに入ります。

具体的には、非同期実行メカニズムは次のとおりです。

すべての同期タスクはメイン スレッドで実行され、実行コンテキスト スタックを形成します。

  1. メインスレッドの他に「タスクキュー」もあります。非同期タスクに実行結果がある限り、イベントは「タスク キュー」に配置されます。

  2. 「実行スタック」内のすべての同期タスクが実行されると、システムは「タスク キュー」を読み取り、その中にどのようなイベントがあるかを確認します。これらの対応する非同期タスクは待機状態を終了し、実行スタックに入り、実行を開始します。

  3. メインスレッドは上記の 3 番目のステップを繰り返し続けます。

  4. メインスレッドが空である限り、「タスクキュー」を読み取ります。これが JavaScript の実行メカニズムです。このプロセスは繰り返され続けます。

    「タスクキュー」内のイベントには、IO デバイスのイベントに加えて、
    ユーザーによって生成されたいくつかのイベント (マウスクリック、ページスクロールなど) も含まれます。 $ (selectot).click(function) など、これらは比較的時間のかかる操作です。
    これらのイベントのコールバック関数が指定されている限り、これらのイベントは発生時に「タスク キュー」に入り、メイン スレッドによる読み取りを待機します。

    いわゆる「

    コールバック関数」(コールバック) は、メイン スレッドによってハングアップされるコードです。クリック イベント $(selectot).click(function)。 ) 前述のコールバック関数です。非同期タスクでは、コールバック関数を指定する必要があります。メインスレッドが非同期タスクの実行を開始すると、対応するコールバック関数が実行されます。たとえば、ajax の成功、完了、エラーも独自のコールバック関数を指定し、これらの関数は「タスク キュー」に追加され、実行を待ちます。

以上がJavaScript における同期と非同期の違いの概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。