Szukaj…


Pętla zdarzeń w przeglądarce internetowej

Zdecydowana większość współczesnych środowisk JavaScript działa zgodnie z pętlą zdarzeń . Jest to powszechna koncepcja w programowaniu komputerowym, co zasadniczo oznacza, że Twój program stale czeka na nowe rzeczy, a kiedy to robią, reaguje na nie. Środowisko hosta wywołuje Twój program, odradzając „pętlę”, „tyknięcie” lub „zadanie” w pętli zdarzeń, która następnie kończy się . Po zakończeniu tej tury środowisko hosta czeka na coś innego, zanim wszystko się zacznie.

Prostym przykładem jest przeglądarka. Rozważ następujący przykład:

<!DOCTYPE html>
<title>Event loop example</title>

<script>
console.log("this a script entry point");

document.body.onclick = () => {
  console.log("onclick");
};

setTimeout(() => {
  console.log("setTimeout callback log 1");
  console.log("setTimeout callback log 2");
}, 100);
</script>

W tym przykładzie środowiskiem hosta jest przeglądarka internetowa.

  1. Parser HTML najpierw wykona <script> . Będzie działać do końca.
  2. Wywołanie setTimeout informuje przeglądarkę, że po 100 milisekundach, powinien enqueue jest zadanie do wykonania danej czynności.
  3. W międzyczasie pętla zdarzeń odpowiada za ciągłe sprawdzanie, czy jest coś innego do zrobienia: na przykład renderowanie strony internetowej.
  4. Jeśli po 100 milisekundach pętla zdarzeń nie będzie zajęta z innego powodu, zobaczy zadanie, które setTimeout kolejkuje i uruchomi funkcję, rejestrując te dwie instrukcje.
  5. W dowolnym momencie, jeśli ktoś kliknie ciało, przeglądarka opublikuje zadanie w pętli zdarzeń w celu uruchomienia funkcji obsługi kliknięć. Pętla zdarzeń podczas ciągłego sprawdzania, co należy zrobić, zobaczy to i uruchomi tę funkcję.

Możesz zobaczyć, jak w tym przykładzie istnieje kilka różnych typów punktów wejścia do kodu JavaScript, które wywołuje pętla zdarzeń:

  • Element <script> jest wywoływany natychmiast
  • Zadanie setTimeout jest wysyłane do pętli zdarzeń i uruchamiane raz
  • Zadanie modułu obsługi kliknięć można wielokrotnie publikować i uruchamiać za każdym razem

Każda kolejka pętli zdarzeń odpowiada za wiele rzeczy; tylko niektóre z nich wywołują te zadania JavaScript. Aby uzyskać szczegółowe informacje, zobacz specyfikację HTML

I ostatnia rzecz: co rozumiemy przez to, że każde zadanie pętli zdarzeń „przebiega do końca”? Rozumiemy, że generalnie nie jest możliwe przerwanie bloku kodu, który jest w kolejce do uruchomienia jako zadanie, i nigdy nie jest możliwe uruchomienie kodu przeplatanego z innym blokiem kodu. Na przykład, nawet jeśli klikniesz w idealnym momencie, nigdy nie możesz uzyskać powyższego kodu, aby zalogować "onclick" kliknięcie "onclick" pomiędzy dwoma setTimeout callback log 1/2" . Wynika to ze sposobu, w jaki działa wysyłanie zadań; jest oparty na współpracy i oparty na kolejkach, a nie na zapobieganiu.

Operacje asynchroniczne i pętla zdarzeń

Wiele interesujących operacji w popularnych środowiskach programowania JavaScript jest asynchronicznych. Na przykład w przeglądarce widzimy takie rzeczy

window.setTimeout(() => {
  console.log("this happens later");
}, 100);

a w Node.js widzimy takie rzeczy jak

fs.readFile("file.txt", (err, data) => {
  console.log("data");
});

Jak to pasuje do pętli zdarzeń?

Działa to tak, że po wykonaniu tych instrukcji informują środowisko hosta (tj. Odpowiednio przeglądarkę lub środowisko wykonawcze Node.js), aby się uruchomiły i zrobiły coś, prawdopodobnie w innym wątku. Gdy środowisko hosta wykona tę czynność (odpowiednio, czeka 100 milisekund lub odczytuje plik file.txt ), opublikuje zadanie w pętli zdarzeń, mówiąc: „wywołaj wywołanie zwrotne, które otrzymałem wcześniej z tymi argumentami”.

Pętla zdarzeń jest wtedy zajęta robieniem rzeczy: renderowaniem strony internetowej, nasłuchiwaniem danych wejściowych od użytkownika i ciągłym wyszukiwaniem opublikowanych zadań. Gdy zobaczy te opublikowane zadania w celu wywołania oddzwaniania, wróci do JavaScript. W ten sposób uzyskujesz zachowanie asynchroniczne!



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow