ホームページ > ウェブフロントエンド > jsチュートリアル > マイクロタスクとマクロタスクとは何ですか?また、JavaScriptの実行順序にどのように影響しますか?

マイクロタスクとマクロタスクとは何ですか?また、JavaScriptの実行順序にどのように影響しますか?

百草
リリース: 2025-03-12 16:20:18
オリジナル
234 人が閲覧しました

マイクロタスクとマクロタスクとは何ですか?また、JavaScriptの実行順序にどのように影響しますか?

マイクロタスクとマクロタスクの理解

JavaScriptのイベントループでは、マイクロタスクとマクロタスクの2つの主要なカテゴリでタスクが処理されます。マクロタスクは、重要な仕事の塊を表す大きなタスクですが、マイクロタスクはより小さく、通常は非同期操作に関連してすぐに注意を払う必要があります。実行の順序は、非同期JavaScriptがどのように機能するかを理解するために重要です。

  • マクロタスク:これらは、イベントループを駆動する主要なタスクです。例は次のとおりです。

    • DOMへの更新をレンダリングします。
    • ユーザーインタラクション(クリック、キープレス)。
    • ネットワーク要求( XMLHttpRequestまたはfetchを使用)。
    • setTimeout()およびsetInterval()
  • マイクロタスク:これらのタスクはマクロタスクよりも優先度が高く、現在のマクロタスクが完了するとすぐに実行されますが、次のマクロタスクが始まる前に実行されます。例は次のとおりです。

    • 約束 ' .then()コールバック。
    • process.nextTick() (node.js specizal)。
    • queueMicrotask()

実行順序

イベントループは、この一般的なプロセスに従います。

  1. マクロタスクの実行:イベントループは、マクロタスクキュー(ユーザークリックイベントなど)からマクロタスクを選択します。
  2. すべての保留中のマイクロタスクを実行します:マクロタスクが完了した後、イベントループはマイクロタスクキュー内のすべてのマイクロタスクを処理します。これらは、他のマクロタスクが考慮される前に完了します。
  3. レンダリング:ブラウザは、マクロタスクおよびマイクロタスクの実行中に作成されたDOMの変更をレンダリングします。
  4. 繰り返しますが、ループは、キューから次のマクロタスクを選択し、プロセスを繰り返すことで続きます。

この優先順位付けされたマイクロタスクの実行により、より小さく、しばしば重要な非同期操作が迅速に処理され、応答性が向上し、ブロッキングが防止されることが保証されます。たとえば、ネットワーク要求(マクロタスク)が後続の計算(マイクロタスク)に必要な値を終了および更新すると、他のユーザーインタラクション(別のマクロタスク)が処理される前に計算が行われます。

マイクロタスクとマクロタスクを使用して、JavaScriptコードを最適化してパフォーマンスを向上させることはできますか?

マイクロタスクとマクロタスクで最適化します

マイクロタスク/マクロタスクのキューを直接制御してパフォーマンスを魔法のように向上させることはできませんが、効率的な非同期コードを作成するにはその動作を理解することが不可欠です。最適化は、これらのメカニズムの戦略的使用に焦点を当て、不必要なブロッキングを回避し、応答性を向上させます。

最適化のための戦略:

  • 緊急操作のマイクロタスクの優先順位付け:即時の結果に依存するタスク(例えば、非同期データに基づいてUI要素の更新)は、約束またはqueueMicrotask()を使用して処理する必要があります。
  • バッチ操作:多数の個別のネットワーク要求(マクロタスク)を作成する代わりに、可能な限りより少ない大きなリクエストに組み合わせます。これにより、多くの個別のタスクを管理するオーバーヘッドが削減されます。
  • メインスレッドのブロックを避けないでください。メインスレッドのブロックと応答性の維持を防ぐために、長期にわたる計算または操作をWebワーカーにオフロードする必要があります。
  • UIアップデートにrequestAnimationFrameを使用:アニメーションまたは頻繁なUIアップデートの場合、 requestAnimationFrame 、ブラウザのレンダリングサイクルと同期するように最適化されているため、 setInterval()を使用します。

重要な注意:早期最適化は有害です。最初にきれいで読みやすいコードの書き込みに焦点を当てます。マイクロタスクとマクロタスクを使用して最適化しようとする前に、アプリケーションをプロファイルしてパフォーマンスボトルネックを識別します。盲目的にマイクロタスクを使用すると、必ずしもコードをスピードアップするわけではありません。最適な応答性を得るために、イベントループ内にタスクを戦略的に配置することです。

マイクロタスクとマクロタスクは、JavaScriptで約束とAsync/待ち声とどのように相互作用しますか?

イベントループ内で約束とasync/async/async/async/async/async

約束とasync/awaitマイクロタスクキューに直接構築されます。これらは、このメカニズムに基本的に依存する非同期操作を管理するためのよりクリーンで読みやすい方法を提供します。

  • 約束:約束が解決または拒否されると、その.then()または.catch()コールバックがマイクロタスクキューに追加されます。これにより、現在のマクロタスクが終了した直後に実行されます。
  • async/await: async/await約束の上に構築された構文砂糖です。 async関数内でawait式が発生した場合、実行は約束が解決するまで一時停止し、その後、 awaitに続くコードはマイクロタスクとしての実行を継続します。

例:

 <code class="javascript">async function fetchData() { const data = await fetch('/api/data'); // fetch is a macrotask, await pauses until it resolves const json = await data.json(); // json() is also a macrotask, execution pauses here too. console.log(json); // This log happens as a microtask after both fetches are complete. } fetchData();</code>
ログイン後にコピー

この例では、 fetch and data.json()はマクロタスクです。ただし、 awaitキーワードにより、後続のconsole.log 、約束が解決した後に実行されるマイクロタスクになり、次のマクロタスクの前にデータが迅速に処理されるようにします。

JavaScriptでマイクロタスクやマクロタスクを操作する際に避けるべき一般的な落とし穴は何ですか?

一般的な落とし穴とそれらを避ける方法

マイクロタスクとマクロタスクを理解することは、効率的な非同期JavaScriptを書くために重要ですが、いくつかの落とし穴は予期しない動作とパフォーマンスの問題につながる可能性があります。

  • 意図しないブロッキング:マイクロタスク内での長期運用は、優先度が高いにもかかわらず、後続のマイクロタスクをブロックする可能性があります。これを防ぐために、複雑な操作をより小さく、より管理しやすいチャンクに分解します。
  • 予期しない実行順序:多くの約束と非同期操作との複雑な相互作用は、慎重に計画されていないと予期しない実行命令につながる可能性があります。徹底的なテストとデバッグは、実行の順序が期待に合わせて確認するために不可欠です。
  • process.nextTick() (node.js)の乱用:特定の状況に役立ちますが、process.node.jsのprocess.nextTick()をoverusedすることは、他のタスクの飢vにつながる可能性があります。慎重に使用してください。
  • エラー処理を無視する:未処理の例外がアプリケーションのクラッシュを防ぐために、約束と非同期操作の両方で潜在的なエラーを常に処理してください。
  • 誤解setTimeout(0) setTimeout(0)必ずしもすぐに実行されることを意味するわけではありません。 Macrotaskキューに追加され、すべての保留中のマイクロタスクの後に実行されます。多くの場合、マイクロタスクの代替として悪用されます。

イベントループの複雑さを理解し、マイクロタスクとマクロタスクを慎重に管理することにより、より効率的で応答性の高い、堅牢なJavaScriptアプリケーションを書くことができます。パフォーマンスのボトルネックを効果的に特定して対処するために、クリアコード、徹底的なテスト、プロファイリングに優先順位を付けることを忘れないでください。

以上がマイクロタスクとマクロタスクとは何ですか?また、JavaScriptの実行順序にどのように影響しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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