[2] [[イベントループ]]における処理の単位を[DFN[[RUBYB[タスク]@en[task]]]]といいます。

* 仕様書

[REFS[
- [12] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2016-12-06 07:17:59 +09:00]]) <https://html.spec.whatwg.org/#event-loops>
-- [1] '''[CITE@en-US-x-hixie[HTML Standard]] ([TIME[2012-03-28 21:58:58 +09:00]] 版) <https://www.whatwg.org/specs/web-apps/current-work/#task-queue>'''
-- [19] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2012-03-28 21:58:58 +09:00]] 版) <https://www.whatwg.org/specs/web-apps/current-work/#the-event-loop>
]REFS]

* 意味

[3] [DFN[[RUBYB[[[タスク]]]@en[task]]]]は、
[[イベント]]の[[ディスパッチ]]、
[[構文解析]]、
[[コールバック]]の呼び出し、
[[fetch]] 結果の処理、
[[DOM]] 操作に対する反応といった、
色々な作業を担当する[[アルゴリズム]]です [SRC[>>1]]。

* 文脈

[5] [[Webブラウザー]]の大部分の処理は、[[タスク]] (の集合) として定義されています。

[7] [[タスク]]の[[キュー]]として、次のものがあります。
[FIG(list middle)[
- [[タスクキュー]]
- [[セッション履歴探索キュー]]
- [[マイクロタスクキュー]]
- [[ポートメッセージキュー]]
- [[未出荷済みポートメッセージキュー]]
- [[pending application cache download process tasks]]
]FIG]

[8] [[フォーム]]は [F[planned navigation]] として[[タスク]]を持つことがあります。

* 状態

[11] [[タスク]]は、[[構造体]]です [SRC[>>1]]。
次の状態を持ちます。

[FIG(list members)[

: [14] [DFN[[F[[RUBYB[[[手順群]]][steps]]]]]] :
[[タスク]]が実施する仕事を指定する[[手順群]]の系列。
[SRC[>>1]]
: [F[源][タスク源]] :
: [15] [DFN[[F[[RUBYB[[[文書]]][document]]]]]] :
[[window event loop]] なら、[[タスク]]に関連付けられた[[文書]]。
それ以外なら、 [CODE[null]]。
[SRC[>>1]]
[SEE[ [[タスクキュー]]
[HISTORY[
[16] 
かつては[[ワーカー]]に関連付けられることもあるとされていました
[SRC[>>13]]。
]HISTORY]
: [F[スクリプト評価環境設定群オブジェクト集合]] :
: [F[[[triggered by user activation]] な[[タスク]]かどうか]] :
: [F[triggered by a user generated orientation change]] :
: [F[[CODE(DOMe)@en[click]] [[イベント]]]] :
[CODE(DOMe)@en[click]] [[イベントオブジェクト]] (あれば)。
[[triggered by user activation]] や [CODE(JS)@en[window.open]] を参照。
: [F[タイマー入れ子水準]] : [[タイマー]]の入れ子の実行に関する制御のための変数です。
[[タイマー]]の[[タスク]]にのみ存在します。
: [F[fetch]] :
[[fetch]] または [CODE[null]]。既定値は [CODE[null]]。[[タスクキュー]]参照。
: [F[順序]] :
[[タスクキュー]]内での相互順序を表す値です。
[[未出荷済みポートメッセージキュー]]が絡む場合を除けば、[[タスクキュー]]内でのみ比較されます。
: [F[捨てる処理]] :
[[handle fetch]] の[[タスク]]を[[サービスワーカーを終端させる]]処理で捨てる時に使います。
: [17] [DFN[[F[[RUBYB[[[走らせられる]]][runnable]]]]]] :
[F[文書]]が [CODE[null]] か、
[F[文書]]の[F[完全に活性]]が[[真]]。
[SRC[>>1]]

]FIG]

[6] [[タスク]]は、いずれかの[[イベントループ]]に ([[タスクキュー]]などに追加されることにより)
所属し、実行されるものです [SRC[>>1]]。基本的には作成された[[イベントループ]]に所属し、
他の[[イベントループ]]に移動することはありませんが、
[[ポートメッセージキュー]]の[[タスク]]のような例外もあります。

[9] 実装戦略によっては、[[タスク]]に他の最適化のための情報を付与する必要があるかもしれません。
例えば [[WebSocketメッセージの受信]]では、必要な [[I/O]] 処理のための[[資源]]が確保されるまで、
他の[[タスク]]を実行することが望ましいとされています。これの実現のためには、
[[イベントループ]]が[[タスクキュー]]から[[タスク]]を選んで実行するに当たり、
[[タスク]]がどのような[[資源]]を必要としており、それが直ちに利用可能であるか否かを判定しなければなりません。

[20] 
[[タスク]]の一種に[[マイクロタスク]]があります。
かつては名前の似た別物とされていたこともありますが、
今では、少なくても[[仕様書]]上は、
[[マイクロタスク]]は[[タスク]]の一種とされています。
[SEE[ [[マイクロタスク]] ]]
[[マイクロタスク]]とそうでない[[タスク]]に構造的な違いはありません。
[[タスク]]が[[マイクロタスク]]であるか否かによって生じる違いもありません。
([[タスクキュー]]に入れられるか[[マイクロタスクキュー]]に入れられるかで、
実行タイミングが違うだけです。)


* 実行

[SEE[ [[イベントループ]] ]]


* 関連

[4] [[タスク・キュー]]は、[[タスク]]の[[順序付き]]の[[リスト]]です [SRC[>>1]]。
[[タスク]]は[[タスク・キュー]]に追加されることによって順に実行されていきます。

[18] [[Webブラウザー]]における[[非同期]]な処理は、すべてが[[タスク]]として説明されているわけではありません。
[[資源]]の [[fetch]] の後の[[非同期]]な処理などは、[[安定状態]]に処理を再開するものとされています。


[23] [[タスク]]は特定の[[イベント・ループ]]により処理されることを意図したものです。
[[タスク]]に関連付けられた[[文書]]についての[[タスク]]を処理する[[イベント・ループ]]が1つあって、
その[[文書]]の[[タスク]]はすべてその[[イベント・ループ]]で処理されます。 [SRC[>>1]]


* 歴史

[REFS[
- [21] [CITE@en[Web Applications 1.0 r7874 Try to clarify event loop terminology.]] ([TIME[2013-05-31 07:22:00 +09:00]] 版) <http://html5.org/tools/web-apps-tracker?from=7873&to=7874>
]REFS]


[10] [CITE@en[Integrate with the Long Tasks spec]]
([[npm1]], [TIME[2018-10-23 07:23:27 +09:00]], [TIME[2021-03-25T06:25:27.000Z]])
<https://github.com/whatwg/html/commit/425a67ba81288305fce86736a0772f84c3f30eed>

[13] [CITE@en[Editorial: rigorize tasks and task queuing]]
([[domenic]], [TIME[2019-05-01 01:36:30 +09:00]], [TIME[2021-03-25T08:59:58.000Z]])
<https://github.com/whatwg/html/commit/f4e29076caad1779336adea40ac2125d6d1c9496>

[22] [CITE@en[Add "queue an element task" algorithm]]
([[dtapuska]], [TIME[2019-12-06 05:15:14 +09:00]], [TIME[2022-01-27T09:31:24.000Z]])
<https://github.com/whatwg/html/commit/a9e1d2ad5a7569010c685b271965ae4a3a34a64b>