ホームページ > ウェブフロントエンド > フロントエンドQ&A > JavaScriptの非同期と同期の違いは何ですか

JavaScriptの非同期と同期の違いは何ですか

青灯夜游
リリース: 2023-01-06 11:17:08
オリジナル
3355 人が閲覧しました

違い: 同期では、関数呼び出しが発行されると、1 つの処理を 1 つずつ実行する必要があり、前の処理が完了するまで次の処理を実行できません。一方、非同期では、非同期プロシージャ呼び出しが行われると、が発行されると、最後に、呼び出し元は結果を取得する前に後続の操作を実行し続けることができます。

JavaScriptの非同期と同期の違いは何ですか

このチュートリアルの動作環境: Windows7 システム、JavaScript バージョン 1.8.5、Dell G3 コンピューター。

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" );
ログイン後にコピー

出力順序は何ですか?

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

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

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

現在のコード (キューに追加する必要のないプログラム) は、そのキュー内のプログラムが完了する前に完了する必要があります。

そのため、結果が期待どおりにならない可能性があります。

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

このキューには何が配置されますか? 配置されるのは setTimeout の関数です

これらの関数は順番にキューに追加されます、

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

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

前のタスクに時間がかかると、次のタスクも待たされることになります。

つまり、タスクキューという概念があります。キューの原因が大量の計算であり、CPU がビジー状態である場合は、そのことを忘れてください。

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

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

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

次のタスクは、前のタスクが実行された後にのみ実行できます。非同期タスクとは、メイン スレッドには入らず、「タスク」に入るタスクを指します。キュー」(タスクキュー)。キュー)では、メインスレッドのタスクが完了し、「タスクキュー」がメインスレッドに通知してタスクの実行を要求し始めた場合にのみ、タスクはメインスレッドに入り実行されます。

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


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


    メインスレッドの他に「タスクキュー」もあります。非同期タスクに実行結果がある限り、イベントは「タスク キュー」に配置されます。
  • 「実行スタック」内のすべての同期タスクが実行されると、システムは「タスク キュー」を読み取り、その中にどのようなイベントがあるかを確認します。これらの対応する非同期タスクは待機状態を終了し、実行スタックに入り、実行を開始します。
  • メインスレッドは上記の 3 番目のステップを繰り返し続けます。


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

「タスク キュー」内のイベントには、IO デバイスのイベントに加えて、ユーザーによって生成されたいくつかの

イベント (マウス クリック、ページ スクロールなど) も含まれます。など)、

たとえば、$(selectot).click(function) など、これらは比較的時間のかかる操作です。

これらのイベントのコールバック関数が指定されている限り、これらのイベントは発生時に「タスク キュー」に入り、メイン スレッドによる読み取りを待機します。

いわゆる「

コールバック関数」(コールバック)

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

プログラミング ビデオ

をご覧ください。 !

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

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート