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:
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:
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?