[35] マイクロタスクは、 Webブラウザーにおける処理の単位で、 変異観測器や約束などの処理で用いられています。
[133] マイクロタスクは、 マイクロタスクをキューに入れる手続きで作られたタスクです。 >>49 マイクロタスクはタスクの分類の1つですが、 仕様書上はただのタスクと構造的な違いはありません。
[134] かつての HTML Standard は最初にタスクキューではなくマイクロタスクキューに入れられたタスク、 と説明していました。意味するところはほぼ同じです。
[51] マイクロタスクが通常のタスクに比べて「マイクロ」であるのは、 タスクがイベントループの全体によって順次処理されていくのに対し、 マイクロタスクのほとんどがそのイベントループの一度の繰り返しの内で順次実行されることを指しています。 マイクロタスク自体もタスクの一種なのであって、 マイクロタスクによってタスクが構成されるような階層構造にはありません。
[135] たまにマイクロタスクが通常のタスクキューに追加されることがあります。
[147] の改訂以前は、 マイクロタスクは2種類に分類されていました >>146。
[50] マイクロタスクには孤独コールバックマイクロタスクと複合マイクロタスクの2種類があります。 >>49
[61] 孤独コールバックマイクロタスクは、 それ自体が実行時の最小単位のタスクとなるようなマイクロタスクです。
[100] ほとんどのマイクロタスクは、孤独コールバックマイクロタスクです。
[42] 孤独コールバックマイクロタスクには、次のものがあります。
[113] かつては次のものも予定されていました。
[120] カスタム要素コールバックもマイクロタスクを使うことが一時想定されていましたが、 最終的には独自のキューを使う形となっています。
[62] 複合マイクロタスクは、 実行時に最小単位のタスク複数個に分割され得るマイクロタスクです。
[78] 複合マイクロタスクの一部として実行されるタスクのことを、 複合マイクロタスク部分タスクといいます。
[77] 例えば mutation observer のマイクロタスクは、複数の MutationObserver
コールバックを呼び出す可能性があり、
それぞれが複合マイクロタスク部分タスクであるような1つの複合マイクロタスクとして定義されています。
[66] 複合マイクロタスクは、イベントループのスピン時の挙動を正しく扱えるように注意する必要があります。 そのために複合マイクロタスク部分タスクを実行する手順 (>>67) が用意されていて、 複合マイクロタスクを定義する仕様書はこれを参照することが期待されています。
[97] 定義上マイクロタスクではありませんが、 マイクロタスクの実行のタイミングで実行される処理として、他に、 拒絶された約束について通知と IndexedDBトランザクションの片付けがあります。
[98] これらの処理は、マイクロタスクとは違って、マイクロタスクキューを使わず毎回適宜実行されます。
[53] イベントループは、 マイクロタスクキューを (タスクキューとは別に) 持ちます。 マイクロタスクキューは、 マイクロタスクのキューです。 初期値は空です。 >>49
[90] ECMAScript 仕様書は独自のジョブキュー PromiseJobs
を規定していますが、これは Web におけるマイクロタスクキューに相当します。
[89] マイクロタスクをキューに入れる処理 >>49 は、 新たなマイクロタスクをマイクロタスクキューに追加するものです。
[152] この処理は、 次の引数を有します。
[137] Web 系の仕様書は、 マイクロタスクをキューに入れる操作を直接使っています。
[91] 抽象演算 EnqueueJob(queueName, job, arguments)
は、次のようにしなければなりません >>76。
[99] ECMAScript 仕様書は、こちらの操作を使っています。
queueNames は PromiseJobs
と ScriptJobs
規定されていますが、 Web では PromiseJobs
しか使いません。
[136] タスクをキューに入れるは、 名前が似ていますが別の処理です。
[54] マイクロタスクのタスク源はマイクロタスクタスク源となります。 >>49 マイクロタスクキューにはタスク源は関係してこないので、ほとんどのマイクロタスクはタスク源と無関係ですが、 マイクロタスクがタスクキューに移されるとタスク源が関係してきます。
[102] マイクロタスクは、マイクロタスクチェックポイントを行う手続きにより、 マイクロタスクキューの順番で実行されます。
[12] イベントループについてマイクロタスクチェックポイントを行うには、 次のようにします。 >>7
[34] イベントループは、 マイクロタスクチェックポイントを行っているを持ちます。 初期値は偽です。 >>7
[58] かつてはマイクロタスクの実行が終わってからマイクロタスクキューから削除されると規定されていました。 (これはタスクの実行でも同じでした。) 現在は削除されてから実行されていると規定されています。どちらも観測可能な挙動は同じです。
[15] マイクロタスクチェックポイントを行うのは次の場面です。
[82] つまりマイクロタスクは、スクリプトやタスクの前後に実行されます。 複数のマイクロタスクがあれば、それらをすべて実行してから次のタスクへと進みます。
[67] 指定された手順について複合マイクロタスク部分タスクを実行するとは次のような手順をいいます >>7。
MutationObserver
だけが中断され、他の MutationObserver
があればそれらは即座に実行されます。[59] マイクロタスクキューとは別に、タスクキューなるものもあります。
[80] 大域スクリプト片付けジョブはマイクロタスクと似ていて同じようなタイミングで実行されますが、 異なるタイミングで実行されることもあります。
[38] 拒絶された約束について通知は、マイクロタスクではありませんが、 マイクロタスクが実行されるタイミングでマイクロタスクの後に実行され、 実質的に特別なマイクロタスクとなっています。
[37] マイクロタスクは変異観測器のための仕組みとして HTML Standard に導入されました。
[39] blob:
についてもマイクロタスクチェックポイントでの処理が検討されましたが、
global script clean-up jobs list という新しい仕組みになりました。
[41] ここまで仕様書上マイクロタスクと呼ばれるものはなく、 マイクロタスクチェックポイントの一連の処理として定義されていました (>>12)。
[52] しかし >>48 によってタスクの一種としてマイクロタスクが定義されるようになりました。 マイクロタスクキューが導入され、マイクロタスクが後に通常のタスクキューによって処理され得る単位となったのもこの時です。 それに加えて >>60 により、複合マイクロタスクが導入され、 マイクロタスクの一部分が複合マイクロタスク部分タスクとして実行されるケースが生じました。
[75] >>74 でマイクロタスクはメインのイベントループだけでなく、ワーカーでも実行可能となりました。
[5] >>4 で安定状態を提供するもの以外でもアルゴリズムの途中からの継続にマイクロタスクが使われるようになっています。
[10] >>6 で XHR の timeout
もマイクロタスクとして再定義されました。
[87] Re: Indexed DB Transactions vs. Microtasks ( (Jonas Sicking 著, 版)) http://lists.w3.org/Archives/Public/public-webapps/2014AprJun/0861.html
[108] The "initialization" steps for Web browsers ( ( 版)) https://mail.mozilla.org/pipermail/es-discuss/2014-June/037554.html
[88] Bug 25714 - [Custom]: Move microtask processing to compound microtask · ffeeba6 · w3c/webcomponents ( ( 版)) https://github.com/w3c/webcomponents/commit/ffeeba6b1a3446ebc183a0ae2b7ee8445e44635d
[22] IRC logs: freenode / #whatwg / 20150120 ( 版) http://krijnhoetmer.nl/irc-logs/whatwg/20150120#l-658
# [11:34] <JakeA> Chrome's implementation performs a microtask checkpoint per listener, Firefox doesn't
Firefox and Safari are correctly exhausting the microtask queue between click listeners, as shown by the mutation callbacks, but promises appear to be queued differently. This is sort-of excusable given that the link between jobs & microtasks is vague, but I'd still expect them to execute between listener callbacks. Firefox ticket. Safari ticket.
With Edge we've already seen it queue promises incorrectly, but it also fails to exhaust the microtask queue between click listeners, instead it does so after calling all listeners, which accounts for the single mutate log after both click logs. Bug ticket.
[31] Add promise rejection tracking events · whatwg/html@61ccc05 ( 版) https://github.com/whatwg/html/commit/61ccc05b7437ba947390928f9e526da49550fed0
[57] Remove the storage mutex due to lack of implementation · whatwg/html@1b918cf ( 版) https://github.com/whatwg/html/commit/1b918cf72fcbba011f83b92ab5d1f483fb1cafa3
[111] Add <script type="module"> and module resolution/fetching/evaluation · whatwg/html@cd1a9fb ( 版) https://github.com/whatwg/html/commit/cd1a9fb1e83f7d0bc30be8b34ecdaf444a0b19a4
[112] Fix #345: Remove table sorting model · whatwg/html@59b7e24 ( 版) https://github.com/whatwg/html/commit/59b7e2466c2b7c5c408a4963b05b13fd808aa07a
[115] Sync with recent changes to the JS spec's job queue · whatwg/html@5af258f ( 版) https://github.com/whatwg/html/commit/5af258f33e3e2f55eb30e611cb7aee625a8bd16a
[118] Clarify settings object, realm, and global relationships · whatwg/html@0866f1b ( 版) https://github.com/whatwg/html/commit/0866f1b3f4b4ea5a99a30909e9bbe557dea0b460
[119] 1193394 – Microtasks and promises ( 版) https://bugzilla.mozilla.org/show_bug.cgi?id=1193394
[122] Unclear if microtasks are running as often as they should · Issue #1294 · whatwg/html ( ()) https://github.com/whatwg/html/issues/1294
[123] Add a new section detailing the various potential realms (domenic著, ) https://github.com/whatwg/html/commit/6399af334edd6000bd394685923df5f0519194ab
[124] Fix incumbent settings object definition and add examples (domenic著, ) https://github.com/whatwg/html/commit/f97c3e478654114bd4c9cc8587418a5519f9eb09
[150] 20821 – What happens if you spin the event loop from inside "perform a microtask checkpoint"? (showModalDialog, document.close()...), , https://www.w3.org/Bugs/Public/show_bug.cgi?id=20821
[95] Re: Compound microtasks vs solitary microtasks (Ian Hickson著, ) https://lists.w3.org/Archives/Public/www-archive/2016Oct/0001.html
[104] Improve the wording around handling timeouts (annevk著, ) https://github.com/whatwg/xhr/commit/4d40787e39eb872de30e40110d1201f90c4beecb
[105] Editorial: modernize perform a microtask checkpoint (annevk著, ) https://github.com/whatwg/html/commit/eb31d93fdf569da9b8529a79c3060868a15fa328
[106] 28920 – If the stack of script settings objects is empty, perform a microtask checkpoint right before executing async or defer script () https://www.w3.org/Bugs/Public/show_bug.cgi?id=28920
[107] 1193394 - Microtasks and promises () https://bugzilla.mozilla.org/show_bug.cgi?id=1193394
[116] Ensure there is an active script while running JS jobs (domenic著, ) https://github.com/whatwg/html/commit/cc3fcc87a7c6f8783efa327b449d7381a0e0303d
[117] Ensure there is an active script while running JS jobs (domenic著, ) https://github.com/whatwg/html/commit/cc3fcc87a7c6f8783efa327b449d7381a0e0303d
[126] Ensure there is an active script while running JS jobs by domenic · Pull Request #3163 · whatwg/html () https://github.com/whatwg/html/pull/3163
[127] Ensure there is an active script while running JS jobs by domenic · Pull Request #3163 · whatwg/html () https://github.com/whatwg/html/pull/3163
[129] Ensure there is an active script while running JS jobs by domenic · Pull Request #3163 · whatwg/html () https://github.com/whatwg/html/pull/3163
[130] Ensure there is an active script while running JS jobs by domenic · Pull Request #3163 · whatwg/html () https://github.com/whatwg/html/pull/3163
[131] Proposal: self.queueMicrotask(f) · Issue #512 · whatwg/html () https://github.com/whatwg/html/issues/512
[132] Editorial: rigorize tasks and task queuing (domenic, , ) https://github.com/whatwg/html/commit/f4e29076caad1779336adea40ac2125d6d1c9496
[142] Editorial: rigorize tasks and task queuing by domenic · Pull Request #4465 · whatwg/html () https://github.com/whatwg/html/pull/4465
[143] Remove compound microtasks (annevk, , ) https://github.com/whatwg/dom/commit/7a8406bcb0332c1370f305c77565b7a3c069541d
[144] Dispatching slotchange within a compound microtask · Issue #734 · whatwg/dom () https://github.com/whatwg/dom/issues/734
[145] Remove compound microtasks by annevk · Pull Request #741 · whatwg/dom () https://github.com/whatwg/dom/pull/741
[146] Remove compound microtasks (annevk, , ) https://github.com/whatwg/html/commit/77240a20c840ac60f0b1102ec4ac8be7df717172
[149] Remove compound microtasks by annevk · Pull Request #4437 · whatwg/html () https://github.com/whatwg/html/pull/4437
[151] Add "queue an element task" algorithm (dtapuska, , ) https://github.com/whatwg/html/commit/a9e1d2ad5a7569010c685b271965ae4a3a34a64b
[140] Add the ability to queue an element task. by dtapuska · Pull Request #5072 · whatwg/html () https://github.com/whatwg/html/pull/5072