Menu
CoddyTech

Pętla zdarzeń

Część sekcji Podstawy Node.js ścieżki Node.js w Coddy. Lekcja 26 z 33.

Funkcje zwrotne i obietnice wykonują się później, a błędy wynikają z braku wiedzy o tym, kiedy dokładnie to następuje.

Node najpierw wykonuje cały kod synchroniczny. Następnie wykonuje mikrozadania: funkcje zwrotne obietnic oraz funkcje przekazane do queueMicrotask. Dopiero potem uruchamia liczniki czasu. setTimeout(fn, ms) uruchamia fn raz, po upływie ms milisekund. Nawet setTimeout(fn, 0) czeka, aż mikrozadania zostaną wykonane.

setTimeout(() => console.log('C timer'), 0);
Promise.resolve().then(() => console.log('B promise'));
console.log('A sync');
// A sync, B promise, C timer

Opóźnienie równe 0 oznacza, że licznik czasu uruchomi się tak szybko, jak to możliwe po wykonaniu mikrozadań, nigdy przed nimi. Liczniki czasu uruchamiają się w kolejności rosnących opóźnień; przy jednakowych opóźnieniach pierwszy uruchamia się licznik ustawiony jako pierwszy.

challenge icon

Wyzwanie

Łatwy

Node uruchamia kod w ustalonej kolejności. Najpierw wykonują się zwykłe linie, potem mikrozadania, takie jak funkcje wywołania zwrotnego obietnic, a następnie timery. Wykorzystaj tę kolejność, aby cztery linie wypisały się w kolejności rosnącej, bez ich przenoszenia.

order.js wypisuje swoje cztery linie w kolejności od 4 do 1. Nie przenoś ani nie zmieniaj kolejności linii. Zamiast tego owiń trzy z nich, aby wykonały się później.

  1. Pozostaw console.log('1 sync') bez zmian. Zwykły kod wykonuje się jako pierwszy.
  2. Owiń linię 2 microtask w queueMicrotask, aby wykonała się zaraz po zwykłym kodzie.
  3. Owiń linię 3 timeout i linię 4 timeout later — każdą w osobne setTimeout. setTimeout(fn, ms) uruchamia funkcję fn jeden raz po upływie ms milisekund. Linia 4 jest ustawiona przed linią 3, więc potrzebuje dłuższego opóźnienia.

node order.js wypisuje wtedy:

1 sync
2 microtask
3 timeout
4 timeout later

Wypróbuj: zanim uruchomisz program, zgadnij kolejność. Następnie naciśnij „Uruchom”; terminal pokaże $ node order.js. Potem ustaw opóźnienie obu timerów na 0 i uruchom program ponownie: 4 timeout later wypisuje się teraz przed 3 timeout, ponieważ przy jednakowych opóźnieniach jako pierwszy uruchamia się timer ustawiony wcześniej. Przywróć dłuższe opóźnienie w linii 4, zanim naciśniesz „Sprawdź”.

Spróbuj swoich sił

// Spraw, aby te linie wypisywały się w kolejności numerycznej, bez zmieniania ich położenia.
// Zamiast tego umieść je w wywołaniach queueMicrotask i setTimeout.
console.log('4 timeout later');
console.log('3 timeout');
console.log('2 microtask');
console.log('1 sync');
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Podstawy Node.js

Poćwicz samodzielnie: Edytor online Express