ブラウザ
 Computer >> コンピューター >  >> ソフトウェア >> ブラウザ

JavaScript入門:queueMicrotaskの基本と使いどころ

はじめに

queueMicrotask は、同期コードを非同期的に実行するために使える比較的新しいブラウザAPIです。

queueMicrotask(() => {
    console.log('queueMicrotaskによって非同期に実行されました');
});

これは、従来 setTimeout を使って行っていた処理とよく似ています。

setTimeout(() => {
    console.log('setTimeoutによって非同期に実行されました');
}, 0);

では、すでに setTimeout があるのに、なぜ queueMicrotask が必要なのでしょうか?

queueMicrotask は関数(タスク)をキューに追加します。そして、現在のタスクが完了し、実行コンテキストの制御がブラウザのイベントループへ戻る前に、待機中の各関数が順番に(FIFO方式で)実行されます。

つまり、queueMicrotask のタスクは、現在のコールスタックが空になった直後、イベントループに制御が渡される前に実行されます。

一方 setTimeout の場合、各タスクは制御がイベントループに渡された後、イベントキューから実行されます。

それでは、setTimeout を先に呼び出してから queueMicrotask を呼び出した場合、どちらが先に実行されるでしょうか?以下のコードを実行して、実際に確認してみてください。

setTimeout(() => {
    console.log('setTimeoutによって非同期に実行されました');
}, 0);

queueMicrotask(() => {
    console.log('queueMicrotaskによって非同期に実行されました');
});

この結果、microtaskとして登録された queueMicrotask のコールバックが先に出力されます。なお、Node.js環境では同じ役割を「process.nextTick」が担っています。

queueMicrotaskを使うべき場面

queueMicrotask を使う明確なルールはありませんが、「現在の実行を妨げずにコードを実行したい」という場面で上手く活用できます。

例えば、値のリストを管理する配列があり、値を挿入するたびに配列をソートすることで検索を高速化するケースを考えてみましょう。

var arr = [];

function add(value) {
  arr.push(value);
  arr.sort();
}

しかし、要素の検索はユーザーが検索ボックスを操作したときに行われます。イベントハンドラは制御がイベントループへ移った後に呼ばれるため、挿入のたびに行われるソート処理が、他の重要な同期コードの実行をブロックしてしまう可能性があります。

そこで、queueMicrotask を使うことで、ソート処理を現在の実行の直後に遅延させ、コードを改善できます。

var arr = [];

function add(value) {
  arr.push(value);
  queueMicrotask(() => {
    arr.sort();
  });
}

このように書き換えることで、複数の値を連続して追加した場合でも、ソートはマイクロタスクとしてまとめて実行されるため、メインの処理への影響を最小限に抑えられます。

まとめ

  • queueMicrotask は、現在のタスク完了後・イベントループ制御が戻る前にコールバックを実行できるAPIである
  • setTimeout はイベントループ経由で実行されるため、queueMicrotask の方が先に実行される
  • 重い処理を少し遅らせて実行したい場合などに有効活用できる

参考資料

  1. Oracle EBSのCPADMINとは?概要と使い方を徹底解説

    Oracle社は、E-Business Suite(EBS)R12.1.3およびR12.2.x向けに、コンカレント処理(Concurrent Processing)用のコマンドラインユーティリティ「CPADMIN」をリリースしました。CPADMINはメニューベースのユーティリティで、これまで個別に提供されていた複数のコンカレント処理関連ツールを統合し、単一のメニューからさまざまなタスクを実行できるようにしたものです。 新しくリリースされたCPADMINは、EBS Release 12におけるcmclean.sqlスクリプトの後継ツールであり、直感的な操作性が大きな特徴です。本記事では、CPAD

  2. Redis Sentinel入門:自動フェイルオーバーで高可用性(HA)を実現する方法

    Redis Sentinelは、Redisにシンプルかつ自動的な高可用性(HA)ソリューションを提供するコンポーネントです。MongoDBのレプリカセットにおける選挙(election)の仕組みに馴染みがある方なら、その概念はそれほど難しくありません。基本構成としては、1台のマスターが複数台(N台)のスレーブへレプリケーションを行い、そこにSentinelデーモンを配置します。Sentinelはアプリケーションサーバー上、またはRedisが稼働しているサーバー上で起動でき、常時マスターの健全性を監視します。あるSentinelがマスターの無応答を検出すると、他のSentinelへ向けてSDOW