In der Welt der Programmierung sind Rückruffunktionen ein entscheidender Bestandteil der asynchronen Programmierung. Aber was genau in der Syntax löst ihre asynchrone Ausführung aus? Überraschenderweise liegt die Antwort nicht in der Syntax selbst, sondern in den zugrunde liegenden Implementierungsdetails.
Entschlüsselung der nicht blockierenden Natur von Rückrufen
برخلاف تصور عمومی، nichts drin Die Syntax einer Callback-Funktion deklariert sie explizit als asynchron. Nehmen Sie die folgenden Beispiele:
setTimeout(function() { console.log("Asynchronous Callback"); }, 100);
my_array.forEach(function(element) { console.log("Synchronous Callback"); });
Beide Beispiele verwenden Rückruffunktionen, aber nur das erste ist asynchron und wird mithilfe von setTimeout um 100 Millisekunden verzögert. Der zweite wird synchron ausgeführt und durchläuft sofort das Array.
Die einzige zuverlässige Methode, um das Verhalten eines Rückrufs zu bestimmen, besteht darin, die Dokumentation zu konsultieren oder einen Test durchzuführen, um seine Ausführungszeit zu überprüfen.
Die Magie hinter asynchronen Funktionen
Javascript bietet als Sprache grundsätzlich keine asynchrone Ausführung von Funktionen. Um dies zu erreichen, wird entweder eine andere asynchrone Funktion (wie setTimeout oder Web Worker) verwendet oder die Funktion ist in C geschrieben.
C-codierte Funktionen wie setTimeout implementieren Asynchronität durch die Ereignisschleife.
Die Ereignisschleife und die asynchrone Ausführung
Die Ereignisschleife ist ein grundlegender Bestandteil eines Webbrowsers Architektur. Es verarbeitet I/O-Vorgänge auf nicht blockierende Weise, sodass mehrere Aufgaben gleichzeitig ausgeführt werden können.
Die Ereignisschleife basiert hauptsächlich auf select() oder ähnlichen Funktionen in C, um I/O-Ereignisse zu überwachen. Wenn Daten verfügbar werden, ruft der Interpreter den entsprechenden Rückruf auf, der diesem E/A-Kanal zugeordnet ist.
Timeout-Management und Web Worker
Die Ereignisschleife verarbeitet Timeout-Ereignisse nahtlos und Web-Worker. Durch die Verwaltung der an select() übergebenen Zeitüberschreitungen kann die Ausführung von Rückrufen für die Zukunft geplant werden. Web-Worker, die in separaten Threads ausgeführt werden, interagieren auch mit der Ereignisschleife, um mit dem Haupt-Thread zu kommunizieren.
Zusätzliche Ressourcen
Für ein tieferes Verständnis der Nichtblockierung I/O-Programmierung in C, siehe: http://www.gnu.org/software/libc/manual/html_node/Waiting-for-I_002fO.html
Erkunden Sie die folgenden Artikel für weitere Einblicke:
Das obige ist der detaillierte Inhalt vonWarum werden Rückruffunktionen manchmal asynchron ausgeführt, obwohl keine explizite Syntax vorhanden ist?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!