Im Bereich der Programmierung spielen Rückrufe eine entscheidende Rolle bei der asynchronen Ausführung. Obwohl allgemein bekannt ist, dass Rückrufe asynchron ablaufen, bleibt der zugrunde liegende Mechanismus hinter diesem Verhalten für viele unklar. Dieser Artikel befasst sich mit den Syntax- und Implementierungsdetails, die eine asynchrone Ausführung in der Callback-basierten Programmierung ermöglichen.
Entgegen der landläufigen Meinung gibt es keine spezifischen syntaktischen Elemente, die vorschreiben, ob eine Funktion asynchron oder synchron ausgeführt wird. Rückrufe können in beiden Modi funktionieren, wie in den folgenden Fällen veranschaulicht:
Asynchron:
setTimeout(function(){ console.log("this is async"); }, 100);
Synchron:
an_array.forEach(function(x){ console.log("this is sync"); });
JavaScript selbst verfügt über keinen inhärenten Mechanismus zur asynchronen Ausführung von Funktionen. Um dieses Verhalten zu erreichen, kann einer von zwei Ansätzen gewählt werden:
C-codierte Funktionen wie setTimeout basieren auf ausgefeilten Techniken, um die asynchrone Ausführung zu erleichtern. Der primär beteiligte Mechanismus ist die Ereignisschleife.
Im Kern jedes Webbrowsers liegt die Ereignisschleife, ein Überbleibsel asynchroner Netzwerkprotokolle, die in den frühen Tagen des Internets entstanden sind. Dieser Mechanismus ermöglicht es dem Browser, mehrere E/A-Anfragen gleichzeitig zu bewältigen, ohne auf zusätzliche Threads zurückgreifen zu müssen.
Die Ereignisschleife basiert auf einem zentralen Systemaufruf in C, der als select() (oder ähnliche Varianten) bekannt ist:
select (max, readlist, writelist, errlist, timeout)
select() ermöglicht es dem System, zahlreiche I/O-Vorgänge gleichzeitig zu überwachen. Wenn Daten auf einem der ausgewählten E/A-Kanäle verfügbar werden, kehrt die Funktion zurück und signalisiert dem Browser, die entsprechende Rückrufausführung zu initiieren.
Wenn eine Rückruffunktion registriert wird, speichert der JavaScript-Interpreter sie und ruft gleichzeitig die Funktion select() auf. Bei seiner Rückkehr korreliert der Interpreter Rückrufe mit bestimmten E/A-Kanälen und löst deren Ausführung aus.
select() ermöglicht es dem Browser außerdem, den Aufrufzeitpunkt von Rückrufen durch Zeitüberschreitungen zu steuern. Durch die sorgfältige Regulierung des an select() übergebenen Timeout-Arguments können Rückrufe für die Ausführung in vorgegebenen Intervallen geplant werden. Dies bildet die Grundlage für Funktionen wie setTimeout und setInterval.
Abgesehen von der Ereignisschleife setzen Webbrowser Web-Worker ein, um die asynchrone Ausführung von JavaScript-Code in separaten Threads zu ermöglichen. Diese Worker müssen sich jedoch weiterhin über select() mit der Hauptereignisschleife verbinden, um zurück zum Hauptthread zu kommunizieren.
Node.js nutzt wie Webbrowser Threading für Datei-/Festplatten-E/A-Vorgänge. Nach Abschluss dieser Aufgaben kommunizieren die Threads mit der Node.js-Ereignisschleife und veranlassen die Ausführung der zugehörigen Rückrufe.
Das Konzept der Asynchronität Die Ausführung in der Callback-basierten Programmierung ist nicht direkt aus der Syntax selbst erkennbar. Dies ist ein Ergebnis zugrunde liegender Mechanismen, vor allem der Ereignisschleife und ihrer Interaktion mit C-Level-Funktionen wie select(). Die Ereignisschleife ermöglicht es Browsern, mehrere E/A-Vorgänge gleichzeitig abzuwickeln und so eine nicht blockierende Ausführung von Rückrufen sicherzustellen. Das Verständnis dieser Prinzipien ist entscheidend, um die Feinheiten der asynchronen Programmierung und ihrer Anwendungen auf verschiedenen Plattformen zu verstehen.
Das obige ist der detaillierte Inhalt vonWie macht JavaScript Rückrufe tatsächlich asynchron?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!