マクロタスクとマイクロタスクに関する質問です。 setTimeout(関数(){ コンソールログ('1') }); 新しいPromise(function(resolve){ コンソールログ('2'); 解決する(); }).then(関数(){ コンソールログ('3') }); コンソールログ('4') 上記のコードの実行順序は何ですか?
おそらく、次のように考えているのでしょう。js が 1 行ずつ実行されることを知らないのでしょうか。SetTimeout ちょっとパニックになったので、ブラウザに貼り付けて見てみました。 信じられない 混乱しながらも、JavaScriptの動作の仕組みをじっくり勉強するしかありません! 1. JavaScriptについて
2. JavaScript イベントループjs はシングルスレッドなので、ウィンドウが 1 つしかないカフェテリアのようなものです。学生は 1 人ずつ並んで食事を取る必要があります。同様に、js タスクも 1 つずつ順番に実行する必要があります。このモードは実行が簡単ですが、将来的に需要、トランザクション、リクエストが増加すると、このシングルスレッド モードの実行効率は必然的に低くなります。 1 つのタスクの実行に長い時間がかかる場合、その間に後続のタスクを実行することはできません。 ニュースに含まれる高解像度の写真の読み込みが非常に遅いのはよくあることです。写真が完全に表示されるまで、Web ページが停止したままでよいのでしょうか?この問題を解決するために、 JavaScript 言語ではタスク実行モードを同期と非同期に分けます。
地図の内容を言葉で表現すると次のようになります。
コード式の場合: データ = [] とします。 $.ajax({ url:blog.csdn.net、 データ:データ、 成功:() => { console.log('送信に成功しました!'); } }) console.log('コード実行が終了しました'); 上記は単純な Ajax リクエスト コードです。
上記のテキストとコードを通じて、js の実行順序について大まかに理解していただけたと思います。しかし、これは、何人かの友人が 2、4、1、3 と答えた理由でもあります。 しかし、実際には、非同期キューにはまだトリックが残っています。面接の質問では、 3. マクロタスクとマイクロタスクマクロタスクとマイクロタスクは標準ではないため、人によって理解の仕方は異なりますが、js では実行順序が統一されています。 マクロタスク:
マイクロタスク:
マクロタスクには以下が含まれます: <script> 全体のコード、 process.nextTickは大きく異なり、異なるノードは均一に実行されず、標準がありません。 ヒント: <script> コード全体をマクロ タスクに入れる人もいますが、私は個人的には好きではありません。私の場合は、実行のメイン スレッドだけです。私は個人的に、マクロ タスクとマイクロ タスクの両方を非同期タスクに分類しています。 面接の質問をもう一度見てみましょう。 //コールバックは非同期タスクです setTimeout(function(){//macro task console.log('1') }); 新しいPromise(function(resolve){ console.log('2');//メインスレッドを同期するresolve(); }).then(function(){//microtask console.log('3') }); console.log('4') //メインスレッドを同期する
したがって、結果は 2、4、3、1 です。 さらに、これについて詳しく説明しましょう。 setTimeout(() =>{//マクロタスクキュー1 console.log('1'); //マクロ タスク チーム 1 タスク 1 setTimeout(() =>{//マクロタスクキュー3(マクロタスクキュー1内のマクロタスク) コンソールログ('2') }, 0) 新しいPromise(resolve => { 解決する() console.log('3') //マクロタスクキュー1タスク2 }).then(() =>{//マクロタスク キュー 1 のマイクロタスク console.log('4') }) }, 0) setTimeout(() =>{//マクロタスクキュー2 コンソールログ('5') }, 0) console.log('6') //メインスレッドを同期する
上記のコードでは何が出力されますか? 4. マクロタスクとマイクロタスクを拡張する上記の質問は複雑です。よく考えてみてください。この複雑な状況で、どのように一つずつ実行すればよいのでしょうか。
検証後、結果は正しいです! js のマクロタスクとマイクロタスクに関するこの記事はこれで終わりです。js のマクロタスクとマイクロタスクに関する関連情報をさらに知りたい場合は、123WORDPRESS.COM で過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
目次説明する:要約する補充するDOM を直接変更して操作する js や jQuery とは異なり、V...
この記事では、ログイン認証を実装するためのExpressの具体的なコードを例として紹介します。具体的...
Selenium Grid の紹介Selenium Grid のいくつかの新しい機能は、今後リリース...
1. 子コンポーネントのthis.$parent.eventを通じて親コンポーネントメソッドを直接呼...
方法1: DOMが提供するイベントオブジェクトのターゲットイベント属性を使用して値を取得し、送信する...
クイックスタート1. Docker Hubでnginxイメージを見つけるdocker 検索 ngin...
序文ActiveMQ は、Apache が開発した最も人気があり強力なオープン ソース メッセージ ...
このソリューションの利点はシンプルさと使いやすさですが、欠点はダウンタイムが長くなることです。 した...
•CSSには多くのセレクターがあります。複数のセレクターを同じ要素に適用するとどうなるでしょうか? ...
解決すべき問題主にコンポーネント間のクロスレベル通信用なぜディスパッチとブロードキャストを自分で実装...
来学期にMySQLを勉強します。事前に自宅で練習していませんでした。インストールに時間がかかるとは思...
Nginx は、リバース プロキシ機能を使用して負荷分散を実装できるほか、フォワード プロキシ機能を...
目次1. コンテナサービスの更新とDockerコンサルの検出1. サービス登録と検出とは何ですか? ...
マウスの位置をマッピングしたり、ドラッグ効果を実装したりすることは、 JavaScriptで行うこと...
この効果は、2つのブラウザが互いにシミュレートしていることを示しています 1. シミュレートされたノ...