1. Die Rolle von Knoten.js,
Die Bedeutung von E/A (E/A ist die Abkürzung von Eingang/Ausgabe, wie z.
Das Problem, das Node.js lösen möchte (Prozesseingabe, hohe Genauigkeit. Zum Beispiel kann es in Online-Spielen Millionen von Spielern und Millionen von Eingaben usw. geben (Node.js ist für die Kategorie geeignet: Node.js ist am besten geeignet, wenn eine Anwendung Daten in das Netzwerk erhalten.
Die Bedeutung der Parallelität (der Begriff Parallelität beschreibt, dass die Dinge gleichzeitig geschehen und miteinander interagieren können. Das E/A -Modell des Knotens ermöglicht es uns, die häufigsten Probleme der Verriegelung und der Parallelität bei multitHhread -asynchronem E/A zu vermeiden).
Demonstrationsnetzwerk I/O
JS -Code
var http = required ('http'), urls = ['www.baidu.com', 'www.10jqka.com.cn', 'www.duokan.com']; Funktion fetchPage (url) {var start = new Date (); http.get ({host: url}, function (res) {console.log ("Antwort von:" + url); console.log ("Anfrage übernommen:", New Date () - Start, "ms");}); } für (var i = 0; i <urls.length; i ++) {fetchpage (urls [i]); }Namens node.js
Wir führen Node Node.js im Terminal aus
Ausgabe:
Wir benötigen Node.js, um auf drei URLs zuzugreifen und die erhaltene Antwort und die Zeit zu melden.
Wir können sehen, dass die Ausgangszeit für die zweimal anders ist. Betroffen von verschiedenen Faktoren, der Zeit zur Lösung von DNS -Anforderungen, geschäftigen Serverprogrammen usw.
Warum ist JavaScript eine ereignisgesteuerte Sprache?
JavaScript dreht sich um die Ereignisarchitektur, die ursprünglich dem Dokumentobjektmodell (DOM) zugeordnet wurde. Entwickler können Dinge tun, wenn Ereignisse auftreten. Zu diesen Ereignissen gehören Benutzer, die auf ein Element klicken, auf der Seite geladen werden usw. Mit Ereignissen können Entwickler Hörer für Ereignisse schreiben, die bei Ereignissen ausgelöst werden.
2. Rückruf
1. Was ist ein Rückruf
2. Analysieren Sie den Rückruf
Ein Rückruf bezieht sich auf die Übergabe einer Funktion als Argument an eine andere Funktion und wird normalerweise nach Abschluss der ersten Funktion aufgerufen.
Beispiel: Zum Beispiel die Hide () -Methode in jQuery,
JS -Code
1, $ ("P"). Hide ('langsam'); 2, $ ("p"). Hide ('langsam', function () {alert ("Der Absatz ist jetzt versteckt")});Rückrufe sind optional.
1 Es ist kein Rückruf erforderlich
2. Es gibt einen Rückruf. Wenn der Absatz versteckt ist, wird er aufgerufen und zeigt eine Alarmaufforderung an.
Um den Unterschied zwischen Code mit und ohne Rückrufe zu erkennen
JS -Code
$ ("P"). Hide ('langsam'); alert ("Der Absatz ist jetzt versteckt"); // 1 $ ("P"). Hide ('langsam', function () {alert ("Der Absatz ist jetzt versteckt")}); // 21. Es gibt keinen Rückruf und die Ausführungsreihenfolge ist gleich. Wir können jedoch sehen, dass der P -Absatz nicht vollständig versteckt war, Alarms erscheint.
2. Es gibt einen Rückruf, und die Ausführung erfolgt nach Abschluss des Fells.
Rückrufe analysieren
JS -Code
Funktion HABRAKFACT (Essen, Getränk, Rückruf) {console.log ('Barakfast von' + Food + ',' + Drink); if (callback && typeof (callback) === "function") {callback (); }} HABREAKFACT ('foast', 'coffee', function () {console.log ('Fertig Frühstück. Zeit für die Arbeit!');});Ausgabe:
Mit Barakfast of Foam, Kaffeefinedes Frühstück. Zeit zur Arbeit!
Hier ist eine Funktion, die mit drei Parametern erstellt wurde. Der dritte Parameter ist ein Rückruf, der eine Funktion sein muss.
Die Haderfast -Funktion zeichnet auf, was Sie in der Konsole essen, und ruft dann die Angabe der Rückruffunktion als Parameter auf.
So verwenden Sie Callbacks für node.js
Beispiel für die Verwendung des Dateisystemmoduls zum Lesen von Dateiinhalten von Disk in node.js
JS -Code
var fs = fordert ('fs'); fsDas Ergebnis ist: der Inhalt in selten.txt.
1. Das Modul FS (Dateisystem) wird für die Verwendung im Skript angefordert
2. Der Dateipfad im Dateisystem wird als erster Parameter für die Fs.ReadFile -Methode bereitgestellt.
3. Der zweite Parameter ist UTF8, der die Codierung der Datei angibt
V.
5. Der erste Parameter der Rückruffunktion ist ERR, mit dem der Fehler beim Lesen der Datei gespeichert wird.
6. Der zweite Parameter der Rückruffunktion besteht darin, sie zu klicken, und der Benutzer speichert die von der Lesendatei zurückgegebenen Daten.
7. Sobald die Datei gelesen wird, wird der Rückruf aufgerufen.
8. Wenn ERR wahr ist, wird ein Fehler geworfen.
9. Wenn ERR falsch ist, können die Daten aus der Datei verwendet werden.
10. In diesem Fall werden die Daten auf der Konsole aufgezeichnet.
Ein weiteres ist das HTTP -Modul, das HTTP -Modul ermöglicht es Entwicklern, HTTP -Clients und Server zu erstellen.
JS -Code
var http = required ('http'); http.get ({host: 'Shapeshed.com'}, function (res) {console.log ("Antwort:" + res.statuscode);}). on ('error', function (e) {console.log ("Fehler:" + e.message);});Ergebnis: Got Response: 200
1. Fordern Sie das HTTP -Modul zur Verwendung im Skript an
2. Geben Sie zwei Parameter zur Methode http.get () an
3. Der erste Parameter ist das Optionsobjekt. In diesem Beispiel müssen Sie die Startseite von Shapeshed.com erhalten
4. Der zweite Parameter ist eine Rückruffunktion mit der Antwort als Parameter
5. Wenn der Remote -Server die entsprechende Funktion zurückgibt, wird die Rückruffunktion ausgelöst.
6. Notieren Sie den Antwortstatuscode in der Rückruffunktion. Wenn es einen Fehler gibt, können Sie es aufzeichnen.
Lassen Sie uns als nächstes sehen, dass 4 verschiedene E/A -Operationen stattfinden. Alle verwenden Rückrufe
JS -Code
var fs = require ('fs'), http = require ('http'); http.get ({host: 'www.baidu.com'}, function (res) {console.log ("baidu.com");}). on ('error', function (e) {console.log ("Fehler:" + E.Message);}); fs http.get ({host: 'www.duokan.com'}, function (res) {console.log ("Duokan.com");}). on ('Fehler', Funktion (e) {console.log ("Fehler:" + E.Message);}); fsKönnen wir wissen, welche Operation zuerst zurückkehrt?
Die Vermutung ist, dass die beiden von der Festplatte gelesenen Dateien zuerst zurückgegeben werden, da es nicht erforderlich ist, das Netzwerk einzugeben, aber es ist für uns schwierig zu sagen, welche Datei zuerst zurückgibt, da wir die Dateigröße nicht kennen. Für den Erwerb von zwei Heimseiten muss das Skript in das Netzwerk eingeben, und die Reaktionszeit hängt von vielen unvorhersehbaren Dingen ab. Der Prozess von Node.js wird erst beendet, wenn ein registrierter Rückruf nicht ausgelöst wurde. Rückrufe lösen zunächst Unvorhersehbarkeit und es ist auch eine effiziente Möglichkeit, mit Parallelität umzugehen (oder mehr als eine Sache nach dem anderen zu tun).
Hier sind die Ergebnisse meiner Ausführung
Synchroner und asynchroner Code
Schauen Sie sich zunächst den Code an, synchronisieren (oder blockieren) den Code
JS -Code
Funktionsschlaf (Millisekunden) {var start = new Date (). GetTime (); while ((new Date (). GetTime () -Start) <MillionSeconds) {}} Funktion fetchPage () {console.log ('Fetching -Seite'); Schlaf (2000); console.log ('Daten, die von der Anfrage von Seite zurückgegeben wurden'); } function fetchapi () {console.log ('API abrufen'); Schlaf (2000); console.log ('Daten, die aus der API zurückgegeben wurden'); } fetchpage (); fetchapi ();Wenn das Skript ausgeführt wird, wird die Funktion fetchpage () aufgerufen. Bis es zurückkehrt, ist der Lauf des Skripts blockiert. Bevor die Funktion fetchpage () zurückgibt, kann das Programm nicht in die Funktion fetchapi () verschoben werden. Dies wird als Blockiervorgang bezeichnet.
Node.js verwendet diesen Codierungsstil fast nie, ruft aber asynchron auf.
Schauen Sie sich den folgenden Code an,
JS -Code
var http = required ('http'); Funktion fetchpage () {console.log ('Fetching Page'); http.get ({host: 'www.baidu.com', Pfad: '/? Delay = 2000'}, Funktion (res) {console.log ('Daten, die von der Anforderung von Seite zurückgegeben wurden. } function fetchapi () {console.log ('API abrufen'); http.get ({host: 'www.baidu.com', Pfad: '/? Delay = 2000'}, Funktion (res) {console.log ('Daten, die aus der Anforderung von API'); } fetchpage (); fetchapi ();Wenn dieser Code erlaubt ist, warten Sie nicht mehr auf die Rückkehr der Funktion Fetchpage (), und die Funktion fetchapi () wird sofort aufgerufen. Der Code wird mithilfe von Rückrufen blockiert. Sobald Sie angerufen wurden, hören beide Funktionen die Rückgabe des Remote -Servers und lösen die Rückruffunktion aus.
Beachten Sie, dass die Rückgabereihenfolge dieser Funktionen nicht garantiert werden kann, sondern mit dem Netzwerk zusammenhängt.
Ereignisschleife
Node.js verwendet die Ereignisschleife von JavaScript, um den von ihm befürworteten asynchronen Programmierstil zu unterstützen. Grundsätzlich ermöglicht die Ereignisschleife das System zuerst die Rückruffunktion und dann aus, wenn das Ereignis in Zukunft auftritt. Dies kann eine Datenbank -Rückgabedaten oder eine HTTP -Anforderungsrückgabedaten sein. Da die Ausführung der Rückruffunktion verschoben wird, bis das Ereignis umgekehrt ist, müssen die Ausführung nicht gestoppt werden, und der Steuerfluss kann in die Node -Laufzeitumgebung zurückkehren, sodass andere Dinge geschehen können.
Node.js wird häufig als Netzwerkprogrammierframework angesehen, da es so konzipiert ist, dass die Unsicherheiten in den Datenflüssen im Netzwerk verarbeitet werden. Was zu solchen Entwürfen beiträgt, sind Ereignisschleifen und die Verwendung von Rückrufen, und sie sind wie Programmierer, die asynchronen Code schreiben können, die auf Netzwerk- oder E/A -Ereignisse reagieren.
Die zu beobachtenden Regeln sind: Die Funktion muss schnell zurückkehren, die Funktion darf nicht blockiert werden und langlebige Operationen müssen auf einen anderen Prozess verschoben werden.
Was für Node nicht geeignet ist. Js beinhaltet die Verarbeitung großer Datenmengen oder laufende Berechnungen für lange Zeit. Node.js wurde entwickelt, um Daten in das Netzwerk zu drücken und sie sofort zu vervollständigen.