Makrotehtävät ja tehtäväjono
Ymmärtäkää, miten ajastimet ja I/O ajoitetaan.
Makrotehtävät ja tehtäväjono on ilmainen JavaScript Academy-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu JavaScript Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. JavaScript Academy-kurssilla on yhteensä 4 oppituntia.
Mikä makrotehtävä on?
Makrotehtävä eli tehtävä on myöhemmin suoritettavaksi ajoitettu työyksikkö, joka suoritetaan nykyisen synkronisen koodin valmistuttua. setTimeout-takaisinsoitot ovat klassinen esimerkki.
Makrotehtävät odottavat tehtäväjonossa, kunnes kutsupino on tyhjä.
setTimeout siirtää suoritusta
setTimeout rekisteröi takaisinsoiton myöhemmin suoritettavaksi. Vaikka viive olisi 0, se suoritetaan vasta kaiken nykyisen synkronisen koodin jälkeen.
console.log('first');
setTimeout(() => console.log('third (timeout)'), 0);
console.log('second');Tehtäväjono
Kun ajastin laukeaa, sen takaisinsoitto sijoitetaan tehtäväjonoon. Tapahtumasilmukka ottaa jonosta yhden tehtävän vasta, kun kutsupino on tyhjä, suorittaa sen loppuun ja tarkistaa tilanteen uudelleen.
console.log('sync start');
setTimeout(() => console.log('task 1'), 0);
setTimeout(() => console.log('task 2'), 0);
console.log('sync end');Tehtävät suoritetaan jonotusjärjestyksessä
Samalla viiveellä ajoitetut tehtävät suoritetaan siinä järjestyksessä, jossa ne ajoitettiin. Tehtäväjono on FIFO: ensimmäisenä sisään, ensimmäisenä ulos.
setTimeout(() => console.log('A'), 0);
setTimeout(() => console.log('B'), 0);
setTimeout(() => console.log('C'), 0);
console.log('sync');Viive on vähimmäisaika, ei tarkka aika
Antamanne viive on vähimmäisaika, jonka jälkeen takaisinsoitto voi tulla suorituskelpoiseksi. Todellinen suoritus tapahtuu vasta, kun pino on tyhjä ja aiemmat tehtävät on suoritettu, joten se voi tapahtua myöhemmin.
setTimeout(() => console.log('100ms'), 100);
setTimeout(() => console.log('0ms'), 0);
console.log('synchronous runs first');Järjestäminen viiveen perusteella
Erilaiset viiveet muuttavat järjestystä: lyhyemmän viiveen tehtävät tulevat suorituskelpoisiksi aiemmin, joten ne suoritetaan yleensä ennen pidemmän viiveen tehtäviä ajoitusjärjestyksestä riippumatta.
setTimeout(() => console.log('50'), 50);
setTimeout(() => console.log('10'), 10);
setTimeout(() => console.log('30'), 30);
console.log('start');Yksi tehtävä joka kierroksella
Tapahtumasilmukka suorittaa täsmälleen yhden makrotehtävän kierrosta kohden ja tekee sen jälkeen muuta työtä ennen seuraavaa kierrosta. Tämä pitää järjestelmän reagoivana tehtävien välillä.
console.log('1');
setTimeout(() => {
console.log('2');
setTimeout(() => console.log('4'), 0);
}, 0);
setTimeout(() => console.log('3'), 0);Sisäkkäiset ajastimet jonoutuvat myöhemmin
Tehtävän sisällä ajoitettu ajastin liittyy jonoon jo odottavien tehtävien perään, joten se suoritetaan myöhemmällä tapahtumasilmukan kierroksella.
setTimeout(() => {
console.log('outer');
setTimeout(() => console.log('inner nested'), 0);
}, 0);
setTimeout(() => console.log('sibling'), 0);setInterval on myös makrotehtävä
setInterval ajoittaa toistuvan makrotehtävän. Tässä suoritamme muutaman kierroksen ja lopetamme clearInterval-kutsulla, jotta tulosteen koko pysyy rajattuna.
let count = 0;
const id = setInterval(() => {
count++;
console.log('tick ' + count);
if (count === 3) clearInterval(id);
}, 10);
console.log('interval scheduled');Synkroninen suoritus voittaa aina
Viiveen pituudesta riippumatta jokainen makrotehtävä odottaa nykyisen suorituksen kaiken synkronisen koodin jälkeen. Pinon on ensin tyhjennyttävä.
setTimeout(() => console.log('macrotask'), 0);
for (let i = 1; i <= 3; i++) console.log('sync ' + i);
console.log('done sync');Miksi makrotehtävillä on merkitystä
Makrotehtävien avulla voitte siirtää työtä myöhemmäksi estämättä muuta suoritusta. Raskaan työn jakaminen ajastetuiksi osiksi pitää sovelluksen reagoivana. Makrotehtävillä ei kuitenkaan ole korkeinta prioriteettia: mikrotehtävät (Promises) suoritetaan ennen seuraavaa makrotehtävää, kuten näette seuraavaksi.
console.log('schedule');
setTimeout(() => console.log('runs after sync'), 0);
console.log('still sync');Pikatarkistus
Milloin setTimeout(cb, 0)-takaisinsoitto suoritetaan?
Kertaus: makrotehtävät
Opitte, miten myöhemmin suoritettava työ ajoitetaan:
- Makrotehtävät (
setTimeout,setInterval) odottavat tehtäväjonossa. - Jono on FIFO, ja tapahtumasilmukka suorittaa yhden tehtävän kierrosta kohden.
- Viive on vähimmäisaika, ja synkroninen koodi suoritetaan aina ensin.
- Mikrotehtävillä on korkeampi prioriteetti, ja tutustutte niihin seuraavaksi.
Opi JavaScript tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 59
- Oppitunnit
- 200
Usein kysytyt kysymykset
Onko oppitunti ”Makrotehtävät ja tehtäväjono” ilmainen?
Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa JavaScript Academy-oppimispolun 3 oppituntia, myös oppitunnin “Makrotehtävät ja tehtäväjono”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. JavaScript Academy-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Makrotehtävät ja tehtäväjono”?
Ymmärtäkää, miten ajastimet ja I/O ajoitetaan. Harjoittelet JavaScript Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni JavaScript Academy-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin JavaScript Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.
Kuinka kauan ”Makrotehtävät ja tehtäväjono”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä JavaScript Academy-oppitunnilla?
Kyllä. Jokainen JavaScript Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- Kutsupino
- Makrotehtävät ja tehtäväjono
- Mikrotehtävät ja Promiset
- queueMicrotask ja suoritusjärjestys