Microtasks
HTML-spesifikaation mukaan microtask on: “arkikielinen tapa viitata tehtävään, joka luotiin queue a microtask algorithm -algoritmin kautta” (lähde). Jokaisella event-loopilla — eli window, worker tai worklet — on oma microtask-jononsa. Jonoon lisätyt tehtävät ajetaan osana perform a microtask checkpoint -algoritmia, jota kutsutaan useista paikoista, pääasiallisesti tehtävän ajamisen jälkeen tehtäväjonosta, joka ei ole microtask-jono, ja jokainen kutsu tähän algoritmiin tyhjentää microtask-jonon — ajamalla kaikki siihen asti jonoon lisätyt tehtävät (ilman uudelleensisääntuloisuutta).
Microtask-jono Servossa
MicroTaskQueue on suoraviivainen spesifikaatioon perustuva toteutus: tehtävälista ja boolean uudelleensisääntuloisuuden estämiseksi checkpointissa.
Yksi luodaan jokaiselle runtime:lle, mikä vastaa spesifikaatiota, koska runtime luodaan per event-loop.
Window event-loopille, joka voi sisältää useita window-objekteja, jono jaetaan kaikkien sen sisältämien GlobalScope:ien kesken.
Dedicated workerit käyttävät child-runtime:a, mutta sillä on silti oma microtask-jononsa.
Microtask-jonotus
Tehtävä voidaan jonottaa microtask-jonoon sekä Rustista että JS-moottorista.
- JS:stä: JS-moottori kutsuu
enqueue_promise_jobaina, kun sen täytyy jonottaa microtask promise-käsittelijöiden kutsumiseksi. Tämä callback-mekanismi asetetaan kerran per runtime. Tämä tarkoittaa, että promisen ratkaiseminen, joko Rustista tai JS:stä, johtaa tähän callbackiin kutsumiseen ja microtaskin jonotukseen. Tiukasti ottaen microtask jonotetaan silti Rustista. - Rustista on useita paikkoja, joista microtaskit jonotetaan eksplisiittisesti “natiivista” Rustista:
- await a stable state -algoritmin toteuttamiseen script-threadin kautta, ilmeisesti vain script-threadin kautta, mikä tarkoittaa, että worker event-loopit eivät koskaan käytä tätä algoritmia.
- dom-queuemicrotask -algoritmin toteuttamiseen sekä window- että worker event-loopeissa.
- Ja useissa muissa paikoissa DOM:issa, jotka kaikki voidaan jäljittää
Microtask-enumin variantteihin - Microtask voidaan jonottaa vain vaiheista, jotka ajetaan tehtävän sisällä, ei koskaan vaiheista, jotka ajetaan “in-parallel” event-loopin kanssa.
Microtask Checkpointien ajaminen
perform-a-microtask-checkpoint vastaa MicrotaskQueue::checkpoint -metodia, ja sitä kutsutaan useissa kohdissa:
- Parserissa, kun törmätään
script-tagiin tokenisoinnin osana. Tämä vastaa #parsing-main-incdata:perform-a-microtask-checkpoint -kohtaa. - Uudelleen parserissa, osana elementin luomista. Tämä vastaa #creating-and-inserting-nodes:perform-a-microtask-checkpoint -kohtaa.
- Osana skriptin ajamisen jälkeistä siivousta. Tämä vastaa #calling-scripts:perform-a-microtask-checkpoint -kohtaa.
- Kahdessa kohdassa (yksi, kaksi)
CustomElementRegistry:ssä spesifikaation alkuperä näistä kutsuista on epäselvä: ne näyttävät olevan “clean-up after script”, mutta metodien dokumentaatiossa viitatuissa spesifikaation osissa ei ole viittauksia tähän. - Worker event-loopissa, osana event-loop-processing-model -algoritmin vaihetta 2.8
- Kahdessa paikassa (yksi, kaksi) window event-loopissa (
ScriptThread), jälleen osana event-loop-processing-model -algoritmin vaihetta 2.8. Tämä täytyy yhdistää yhdeksi kutsuksi, ja se, mikä on “tehtävä”, täytyy selventää (TODO(#32003)). - Paint worklet -toteutuksemme ei näytä vielä ajavan tätä algoritmia.