Vorwort
In meinem Bild erschien Asynchronous zuerst mit Ajax. Zu dieser Zeit arbeitete ich immer noch an .NET und dann veröffentlichte .NET tatsächlich eine asynchrone Kontrolle ...
Obwohl ich endlich wusste, dass es nicht asynchron war ... dann wird das Front-End-Asynchron sehr verwendet. Wenn es sich nicht um ein asynchrones Programm handelt, ist es Ihnen peinlich zu sagen, dass die von Ihnen geschriebenen Nodejs von Opportunity JavaScript gemacht wurden.
Das Merkmal des asynchronen Programmiermodells wurde ebenfalls vorgestellt. Asynchronous hat viele Vorteile, aber es ist ein Albtraum für Design. Asynchron kann das Timing stören, sodass es die Designschwierigkeiten erhöht.
Asynchronous hat jedoch die Leistungsverbesserung und die Benutzererfahrung revolutioniert, sodass die asynchronen Merkmale von NodeJS ziemlich offensichtlich sind. Heute werden wir es einfach lernen
Asynchron I/O
Tatsächlich gibt es auf Betriebssystemebene nur zwei E/A-Methoden, blockiert und nicht blockiert
Im Blockierungsmodell muss die Anwendung warten, bis die E/A abgeschlossen ist, bevor das Ergebnis zurückgegeben wird. Sein Merkmal ist, dass der hintere Mittelfeldspieler aufgerufen wird, auf das System zu warten, um alle Vorgänge abzuschließen. Dies lässt die CPU warten, anstatt unmittelbar nach dem Blockierungsanruf zurückzukehren.
Ich habe ein Buch gelesen, als ich ein Anfänger war, aber ich hatte das Gefühl, dass es hier nicht klar beschrieben wurde. Darüber hinaus ist das asynchrone Modell tatsächlich sehr groß, nur eine Verbesserung des Gefühls. Lassen Sie mich Ihnen ein einfaches Beispiel geben
Ich habe jetzt eine einseitige Anwendungsansicht von zwei einseitigen Anwendungen. Bei der Suche muss ich über verschiedene Kanäle suchen. Shenzhen muss einen Dritten anrufen, und der Dritte erhält dann Daten aus bestimmten Kanälen.
Natürlich ist es zu dieser Zeit sehr langsam. Wenn ich direkt von A nach B und B zum Laden von Daten ausschneide, wird es kein Problem geben, aber jetzt ist das Problem, dass ich Animationseffekte beim Wechsel von A nach B. brauche
Dies erfordert, dass das BView -Rendering während des Schaltvorgangs beendet ist und zumindest nicht an den Prozess geliefert wird, um die Daten zu erhalten und die Renderung zu beginnen. Daher ist Asynchron möglicherweise nicht so einfach zu bedienen. Selbst wenn die Daten asynchron angefordert werden, müssen die Daten erhalten werden, bevor die Seite geladen werden kann.
Dies ist immer noch blockiert. Das Laden ist, es gibt keine Möglichkeit, dies im Geschäft zu tun
Keine Technologie ist perfekt, Blockade führt dazu, dass die CPU darauf wartet, verschwendet zu werden. Nicht blockierende Störungslogik. Möglicherweise ist auch die Umfrage zu werden, um zu bestätigen, ob die Last abgeschlossen ist (ich habe verwendet, um zu erkennen, ob ein DOM generiert wurde)
NodeJs nimmt einen Ereignisschleifmechanismus an. Wenn der Prozess beginnt, erstellt der Knoten eine tote Schleife. Jeder Prozess der Ausführung des Schleifenkörpers ist eine Zecke. Der Prozess jeder Zecke ist zu sehen, ob es Ereignisse gibt, die verarbeitet werden müssen.
Wenn es vorhanden ist, entfernen Sie die verwandte Veranstaltung, führen Sie sie aus und geben Sie dann die nächste Logik ein. Wenn es nein gibt, beenden Sie die Schleife
Bei jedem Tick -Prozess gibt es in jeder Ereignisschleife einen oder mehrere Beobachter. Der Prozess der Beurteilung, ob ein Ereignis verarbeitet werden muss, besteht darin, diese Beobachter zu fragen, ob das Ereignis verarbeitet werden muss.
Nehmen Sie unser HTML -Ereignismodell als Beispiel
Für HTML ist jeder seiner DOM ein Beobachter. Das DOM der Seite beobachtet die Änderungen unserer Webseite. Nachdem wir einem DOM einen AddEventListener zur Verfügung gestellt haben, werden wir eine Rückruffunktion registrieren. Die Ereignisse, die wir registrieren, werden in ein "Container" -Objekt platziert. Zu diesem Zeitpunkt ist es nur eine Registrierung. Diese Funktionen werden nach der Erfüllung der Bedingungen ausgelöst (wenn sich die Seite ändert), und die zugehörigen Ereignisse werden zur Ausführung aus dem Container herausgenommen.
Wir klicken jetzt einmal auf einen Punkt auf der Seite und nehmen dann die Klickereignissammlung aus dem Container heraus. Wir werden die relevanten DOMs finden und dann die Rückruffunktionen dieser DOMs auslösen.
Ereignisse können von Benutzerkklicks oder Datenänderungen stammen. Im Knoten kommen Ereignisse hauptsächlich aus Netzwerkanfragen und Datei -E/O. Diese Ereignisse werden entsprechende Beobachter enthalten, z. B. Dateibeobachter und Netzwerkbeobachter.
Dies ist auch ein typisches Produktions-/Verbrauchsmodell, asynchrones E/A, Netzwerkanfragen zur Bereitstellung von Ereignisproduktionen, Ereignisse werden an verschiedene Beobachter weitergeleitet
PS: Klicken Sie als Beispiel Klick. Jeder DOM -Beobachter registriert das Ereignis zuerst, der Seitenvorgang überwacht ständig die Seite, der Benutzer klickt auf das Seitenproduktionsereignis, und dann wird das registrierte Klickereignis aus dem Container herausgenommen und ausgeführt.
Die allgemeine Funktionslogik wird von uns gesteuert:
Die Codekopie lautet wie folgt:
var foreach = function (Liste, Rückruf) {
für (var i = 0, len = list.length; i <len; i ++) {
Rückruf (Liste [i], i, list);
}
}
Bei Asynchronen wird die Rückruffunktion vom Entwickler nicht mehr gesteuert. Jedes Mal, wenn ein JS -Anruf initiiert wird, wird ein Übergangsproduktanforderungsobjekt generiert.
Die Codekopie lautet wie folgt:
fs.open = function (Pfad, Flags, Modus, Rückruf) {
bingding.open (pathmodule._makelong (Pfad), StringToflags (Flags), Modus, Rückruf);
};
Fs.open öffnet eine Datei basierend auf dem Pfad und den Parametern, um relevante Daten zu erhalten. Die C ++ - verwandte Schnittstelle wird intern bezeichnet und während des Prozesses wird ein Zwischenobjekt generiert, und alle unsere Zustände werden enthalten ...
PS: Ich fühle mich nicht gut, nachdem ich es so lange gesehen habe
Abschluss
Im obigen dreht sich alles um asynchrones E/A in NodeJs. Persönliche Zusammenfassung, wenn es Auslassungen oder Fehler gibt, weisen Sie sie bitte darauf hin.