1. ホーム
  2. ジャバスクリプト

[解決済み】イベントループ内でのマイクロタスクとマクロタスクの違いについて

2022-04-10 09:24:19

質問

Promises/A+の仕様書を読み終えたところで、マイクロタスクとマクロタスクという用語に出会いました:以下を参照してください。 http://promisesaplus.com/#notes

この用語は初めて聞いたのですが、どんな違いがあるのでしょうか?

すでにウェブ上でいくつかの情報を見つけようとしましたが、私が見つけたのはw3.org Archivesのこの投稿だけです(私にはこの違いを説明していません)。 http://lists.w3.org/Archives/Public/public-nextweb/2013Jul/0018.html

さらに、"macrotask"というnpmモジュールを発見しました。 https://www.npmjs.org/package/macrotask ここでも、具体的に何が違うのかが明確にされていません。

私が知っているのは、イベントループと関係があるということだけです。 https://html.spec.whatwg.org/multipage/webappapis.html#task-queue https://html.spec.whatwg.org/multipage/webappapis.html#perform-a-microtask-checkpoint

このWHATWGの仕様書を見れば、理論的には自分で違いを抽出できるはずなのですが。しかし、専門家による短い説明から、他の人も恩恵を受けることができると確信しています。

どのように解決するのか?

イベントループを1周させることで ちょうど1回 のタスクが処理されています。 マクロタスクキュー (このキューは単に タスクキュー の中で WHATWG仕様 ). このマクロタスクが終了した後、利用可能なすべての マイクロタスク が処理される。つまり、同じゴーアラウンドサイクルの中で処理される。これらのマイクロタスクが処理されている間、さらに多くのマイクロタスクをキューに入れることができ、マイクロタスクキューがなくなるまで、すべて1つずつ実行されます。

これによって、現実的にはどのようなことが起こるのでしょうか?

もし マイクロタスク 再帰的に他のマイクロタスクをキューに入れるので、次のマクロタスクが処理されるまで長い時間がかかるかもしれません。つまり、UIがブロックされたり、終了したI/Oがアプリケーション内でアイドル状態になったりする可能性があります。

しかし、少なくともNode.jsのprocess.nextTick関数(この関数は、nextTickをキューに入れる。 マイクロタスク このようなブロッキングに対しては、process.maxTickDepthによる保護が組み込まれています。この値はデフォルトで 1000 に設定されており、以下の処理を削減します。 マイクロタスク この制限に達すると、次の マクロタスク が処理される)

では、いつ何を使えばいいのでしょうか?

基本的には マイクロタスク 非同期で行われることを同期的に行う必要がある場合(つまり、例えば この(マイクロ)タスクを直近で実行する ). それ以外の場合は マクロタスク .

使用例

macrotasksです。 セットタイムアウト , セットインターバル , セットイミディエイト , requestAnimationFrame , 入出力 , UIレンダリング

microtasksです。 プロセス.nextTick , プロミス , queueMicrotask , ミューテーションオブザーバ