[解決済み】イベントループ内でのマイクロタスクとマクロタスクの違いについて
質問
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
,
ミューテーションオブザーバ
関連
-
[解決済み】Heroku:ノードアプリで「このアプリにはデフォルトの言語が検出されませんでした」エラーがスローされる
-
[解決済み] ローカルファイルを開くことができません - Chrome: ローカルリソースのロードが許可されていません
-
[解決済み] -saveと-save-devの違いは何ですか?
-
[解決済み] let "と "var "の使い分けは?
-
[解決済み] package.jsonのチルダ(~)とキャレット(^)の違いは何ですか?
-
[解決済み] callとapplyの違いは何ですか?
-
[解決済み] npm package.jsonファイルのdependencies, devDependencies, peerDependenciesの違いは何ですか?
-
[解決済み] Bowerとnpmの違いは何ですか?
-
[解決済み] JavaScriptのnullとundefinedの違いは何ですか?
-
[解決済み】PromiseとObservablesの違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】パッシブイベントリスナー内部でpreventDefaultができない
-
[解決済み】Failed to load resource: net::ERR_FILE_NOT_FOUND loading json.js
-
[解決済み】document.getElementByIDは関数ではありません。
-
[解決済み】JavaScriptのisset()に相当するもの
-
[解決済み】JavaScriptのgetElementByNameが機能しない
-
[解決済み] テスト
-
[解決済み】JavaScriptで相対URLへのリダイレクトを行う
-
[解決済み】ES6マップオブジェクトをソートすることは可能ですか?
-
[解決済み】HTMLの最初の行に予期しないトークン<がある。
-
[解決済み】未定義のプロパティ 'forEach' を読み取ることができない