Myślę o tym i oto co wymyśliłem:
Zobaczmy ten kod poniżej:
console.clear();
console.log("a");
setTimeout(function(){console.log("b");},1000);
console.log("c");
setTimeout(function(){console.log("d");},0);
Przychodzi żądanie i silnik JS rozpoczyna wykonywanie powyższego kodu krok po kroku. Pierwsze dwa połączenia to połączenia synchronizacyjne. Ale jeśli chodzi o setTimeout
metodę, staje się wykonaniem asynchronicznym. Ale JS natychmiast wraca z niego i kontynuuje wykonywanie, co nazywa się Non-Blocking
lub Async
. I kontynuuje pracę nad innymi itp.
Wyniki tego wykonania są następujące:
acdb
W zasadzie druga setTimeout
została ukończona jako pierwsza, a jej funkcja zwrotna jest wykonywana wcześniej niż pierwsza i to ma sens.
Mowa tutaj o aplikacji jednowątkowej. JS Engine kontynuuje to i dopóki nie zakończy pierwszego żądania, nie przejdzie do drugiego. Ale dobrą rzeczą jest to, że nie będzie czekać na operacje blokujące, takie jak setTimeout
rozwiązanie, więc będzie szybsze, ponieważ akceptuje nowe przychodzące żądania.
Ale moje pytania dotyczą następujących elementów:
# 1: Jeśli mówimy o aplikacji jednowątkowej, to jaki mechanizm przetwarza, setTimeouts
podczas gdy silnik JS przyjmuje więcej żądań i wykonuje je? W jaki sposób pojedynczy wątek kontynuuje pracę z innymi żądaniami? Co działa, setTimeout
gdy inne żądania wciąż przychodzą i są wykonywane.
# 2: Jeśli te setTimeout
funkcje są wykonywane za kulisami, podczas gdy więcej żądań przychodzi i jest wykonywanych, co wykonuje asynchroniczne wykonania za kulisami? Co to za rzecz, o której mówimy, zwana EventLoop
?
# 3: Ale czy nie powinno się umieszczać całej metody w EventLoop
tak, aby całość została wykonana i wywołana została metoda wywołania zwrotnego? Oto, co rozumiem, mówiąc o funkcjach wywołania zwrotnego:
function downloadFile(filePath, callback)
{
blah.downloadFile(filePath);
callback();
}
Ale w tym przypadku, skąd silnik JS wie, czy jest to funkcja asynchroniczna, aby mógł umieścić wywołanie zwrotne w EventLoop
? Być może coś w rodzaju async
słowa kluczowego w C # lub jakiegoś rodzaju atrybutu wskazującego, że metoda, którą zastosuje JS Engine, jest metodą asynchroniczną i powinno być odpowiednio traktowane.
# 4: Ale artykuł mówi całkiem przeciwnie do tego, co przypuszczałem na temat tego, jak może działać:
Pętla zdarzeń to kolejka funkcji zwrotnych. Podczas wykonywania funkcji asynchronicznej funkcja zwrotna jest umieszczana w kolejce. Silnik JavaScript nie rozpoczyna przetwarzania pętli zdarzeń, dopóki kod nie zostanie wykonany po wykonaniu funkcji asynchronicznej.
# 5: I jest tutaj ten obraz, który może być pomocny, ale pierwsze wyjaśnienie na obrazku mówi dokładnie to samo, co w pytaniu numer 4:
Więc moje pytanie ma na celu uzyskanie wyjaśnień na temat wymienionych powyżej pozycji?