W przeciwieństwie do innych języków programowania, JavaScript nie ma wbudowanej metody uśpienia. Nie można więc po prostu wywołać funkcji sleep() w celu wstrzymania programu Node.js. Istnieją jednak inne sposoby na to, aby program czekał przez określony czas.

W tym samouczku omówiono trzy podejścia: setTimeout, async/await i pakiet obietnicy snu.

Używanie setTimeout() do oczekiwania na określony czas

ten setTimeout() funkcja planuje wykonanie kodu środowiska wykonawczego po upływie określonego czasu. Przyjmuje funkcję i czas opóźnienia w milisekundach. Oto składnia:

setTimeout(funkcjonować(), timeInMs)

Załóżmy na przykład, że masz funkcję, która drukuje na konsoli:

funkcjonowaćprintSentence() {
konsola.log("Używanie setTimeout()")
}

Aby uruchomić powyższą funkcję po upływie dwóch sekund, przekaż funkcję i czas opóźnienia 2000ms do setTimeout() funkcjonować:

setTimeout (printSentence, 2000)

Chociaż to działa, nie ma gwarancji, że funkcja zostanie uruchomiona dokładnie po dwóch sekundach. Na pewno zajmie to co najmniej tyle czasu, ale może zająć więcej.

instagram viewer

Czy funkcja setTimeout() jest dokładna?

Tak, ale z pewnymi zastrzeżeniami. setTimeout() jest asynchroniczna funkcja JavaScript co oznacza, że ​​nie blokuje. Zaplanowany kod jest dodawany do pętli zdarzeń, podczas gdy reszta programu jest kontynuowana.

Po upływie czasu opóźnienia Twój program wykona zaplanowany kod, ale tylko wtedy, gdy będzie mógł to zrobić. Jeśli inny kod znajduje się na stosie wywołań, zostanie wykonany jako pierwszy, nawet jeśli zaplanowany kod ma zostać uruchomiony. W tym miejscu może wystąpić dodatkowy czas opóźnienia, stąd niedokładność.

Rozważ następujący program.

konsola.log("Witaj świecie!")

funkcjonowaćprintSentence() {
konsola.log("Używanie setTimeout()")
}

setTimeout (printSentence, 2000)
konsola.log("Zrobione")

Oto, co wyświetli konsola po jej uruchomieniu:

Witaj świecie!
Zrobione
Używanie setTimeout()

Ten program wprowadza opóźnienie, ale opóźnia tylko kod, do którego przechodzi setTimeout(). Reszta programu jest kontynuowana, a zaplanowany kod przerywa go dopiero po upływie czasu trwania. Jeśli chcesz uruchomić cały ten kod w kolejności, z przerwą w środku, używając setTimeout() nie będzie działać.

Jedną z alternatyw jest napisanie kodu synchronicznego, który będzie blokował wykonywanie tak długo, jak tego potrzebujesz. Na przykład możesz użyć zrób...gdy pętla blokująca wątek wykonania do czasu upłynięcia czasu opóźnienia:

funkcjonowaćopóźnienie(SM) {
stały data = Data.teraz();
pozwalać bieżąca data = zero;

robić {
bieżąca data = Data.teraz();
} chwila (bieżąca data - data < ms);
}

konsola.log("Witaj świecie");
opóźnienie (2000);
konsola.log("Zostanie wydrukowany po 2 sekundach!");

ten opóźnienie() funkcja zapętla się, dopóki bieżący czas nie będzie równy lub większy niż jej czas rozpoczęcia plus opóźnienie. Minusem tego podejścia jest to, że obciąża on procesor, szczególnie przy dużych opóźnieniach. ten zrób...późna pętla musi obliczyć pozostały czas po każdej milisekundzie.

Używanie Async/Await do opóźniania programu Node.js

jakiś czekać na wyrażenie powoduje wstrzymanie wykonywania do czasu rozwiązania obietnicy. Umożliwia uruchamianie kodu asynchronicznego tak, jakby był synchroniczny, ale bardziej wydajnie niż przez ręczne blokowanie wykonywania. Możesz użyć wait tylko wewnątrz funkcji oznaczonej asynchroniczny.

funkcjonowaćopóźnienie(czas) {
zwrócićNowyObietnica(rozwiąż => setTimeout (rozwiąż, czas));
}

asynchronicznyfunkcjonowaćprintSentence() {
konsola.log("Witaj świecie")
czekać na opóźnienie(2000);
konsola.log("Zostanie wydrukowany po 2 sekundach");
}

printSentence();

To jest wynik powyższego programu:

Witaj świecie
Zostanie wydrukowany po 2 sekundach

Korzystanie z Pakietu sen-obietnica

ten sen-obietnica pakiet upraszcza proces wstrzymywania programów Node.js. Wystarczy go wywołać i określić czas opóźnienia w milisekundach.

Zacznij od zainstalowania go przez npm:

npm zainstalowaćspać-obietnica

Oto przykład, jak możesz go użyć w swoim programie:

stały sen = wymagać(„obietnica snu”);

(asynchroniczny () => {
konsola.log("Witaj świecie.");
czekać na spać(2000);
konsola.log("Zostanie wydrukowany po dwóch sekundach.");
})();

Po uruchomieniu programu dane wyjściowe będą następujące.

Witaj świecie.
Zostanie wydrukowany po dwóch sekundach.

Wybór odpowiedniego podejścia

Implementacja funkcji uśpienia w Node.js może być trudna. Decydując, jak się do tego zabrać, zastanów się, co chcesz osiągnąć. Jeśli chcesz tylko opóźnić jakiś kod, na minimalny czas, setTimeout() to dobra opcja. Ale jeśli chcesz wstrzymać wykonywanie całego programu, powinieneś użyć asynchroniczna/oczekiwanie.

Synchroniczne vs. Programowanie asynchroniczne: czym się różnią?

Czytaj dalej

UdziałĆwierkaćUdziałE-mail

Powiązane tematy

  • Programowanie
  • Tworzenie stron internetowych
  • Programowanie
  • JavaScript

O autorze

Mary Gathon (19 opublikowanych artykułów)

Mary Gathoni jest programistą z pasją do tworzenia treści technicznych, które mają nie tylko charakter informacyjny, ale także angażują. Kiedy nie koduje ani nie pisze, lubi spędzać czas z przyjaciółmi i przebywać na świeżym powietrzu.

Więcej od Mary Gathoni

Zapisz się do naszego newslettera

Dołącz do naszego newslettera, aby otrzymywać porady techniczne, recenzje, bezpłatne e-booki i ekskluzywne oferty!

Kliknij tutaj, aby zasubskrybować