Asynchroniczność w Node.js – pierwsze kroki

W tym tutorialu zapoznamy się z asynchronicznością Node.js na przykładzie wykorzystania funkcji związanych z kontrolą upływu czasu, które dostępne są globalnie w Node.js.

Tworzymy plik apka.js i umieszczamy w niej poniższy kod, który najpierw inicjuje zmienną wait z wartością 3000, wyrzuca do konsoli tekst Zaczynamy... a następnie uruchamia funkcję setTimeout(), która z kolei wykonuje swój pierwszy parametr (czyli funkcję callback) najszybciej po upływie czasu określonego w drugim parametrze, czyli wait. Jak głosi dokumentacja, parametr ten podać należy w milisekundach, czyli tysięcznych częściach sekundy. W naszym przypadku będą to 3000 milisekund = 3 sekundy. Funkcja, która wykona się po upływie tych 3 sekund nie robi nic innego, tylko wyrzuca do konsoli tekst 'Upłynęły minimum 3 sek...'.

var wait = 3000;
console.log("Zaczynamy...");
setTimeout(function(){
    console.log("Upłynęły minimum 3 sek...")
}, wait);

Po zapisaniu i uruchomieniu skryptu komendą node w wierszu poleceń, powinniśmy zobaczyć taki wynik:

kurs-node-js-poczatki

Przy czym ten drugi tekst pojawi się oczywiście nie od razu, ale po upływie co najmniej 3 sekund.

Zobaczmy, co się stanie, gdy dodamy jeszcze jeden console.lo() na koniec kodu:

var wait = 3000;
console.log("Zaczynamy...");
setTimeout(function(){
    console.log("Upłynęły minimum 3 sek...")
}, wait);
console.log("jestem na końcu ;)");

Wynik:

kurs-node-js-pierwsze-kroki-asynchroniczny

Fakt, że instrukcja, która w naszym kodzie jest ostatnia wcale nie wykonała się jako ostatnia ale przed callbackiem z funkcji setTimout() świadczy o asynchronicznym działaniu javascriptu i całego Node.js. Nasz program, w momencie gdy dotarł do instrukcji setTimeout() nie czekał aż miną 3 sekundy, ale zlecił tej funkcji odczekanie tych 3 sekund, wykonanie callbacka i wrócenie z wynikiem. Sam natomiast wykonał kolejną instrukcję, czyli console.log(„jestem na końcu ;)”);. Kiedy setTimeout() wrócił do głównego wątku naszego programu z wynikiem, wtedy został wykonany. Stąd taka kolejność komunikatów naszego programu. Więcej o asynchroniczności napisałem w tym artykule: Co to znaczy, że Javascript jest asynchroniczny?