‫Kursleiter: Willkommen zurück!
‫In diesem Video werden wir wie zuvor
‫Dateien lesen und zwei Dateien schreiben, jedoch auf asynchrone Weise.
‫Lassen Sie uns hier zuvor einige Kommentare hinzufügen.
‫Dies ist
‫also der blockierende, synchrone Weg, und dann werden wir eine
‫Übung auf nicht blockierende, asynchrone Weise durchführen.
‫Wir werden also nicht
‫das Gleiche tun, wir erfinden
‫hier nur eine andere Art von verrückter Übung.
‫Um eine Datei asynchron zu lesen, funktioniert
‫es also wie folgt.
‫Auch hier brauchen wir das FS-Modul und dann die Datei lesen,
‫aber diesmal natürlich nicht die Dateisynchronisierung.
‫Und wieder übergeben wir den Namen der Datei oder den eigentlichen
‫Pfad zur Datei, und so ist
‫es wieder txt, und die Datei, die ich
‫jetzt möchte, heißt start. txt,
‫also diese hier.
‫Ups, das tut mir leid.
‫Das ist also die Datei, die ich haben möchte, die Aufgabe lautet: Lesen
‫Sie dies, und ich werde Ihnen später erklären, warum.
‫Kümmern Sie sich vorerst nicht um den Inhalt hier.
‫In der
‫gelesenen Datei müssen wir die Dateicodierung also eigentlich nicht angeben, okay.
‫Der nächste Parameter,
‫der zweite, wird also eine Callback-Funktion sein, und das
‫haben wir in der letzten Vorlesung gelernt.
‫Node JS basiert also auf Callbacks, um
‫ein asynchrones Verhalten zu implementieren, und so
‫funktioniert es.
‫Node beginnt also hier im Hintergrund
‫mit dem Lesen dieser Datei und sobald sie
‫fertig ist, startet es die Callback-Funktion, die wir hier angeben.
‫Okay, und es ruft diese Callback-Funktion mit
‫zwei Argumenten auf.
‫Der erste ist der Fehler
‫und der zweite sind die tatsächlichen Daten, okay?
‫Dieser Fehler-First-Callback-Stil ist also in Node
‫JS sehr typisch, okay.
‫Daher ist der erste Parameter
‫in einem Callback oft der Fehler, falls einer aufgetreten
‫ist, und der zweite Parameter sind dann die Daten selbst.
‫Wichtig ist
‫hier, dass der Fehler normalerweise immer der erste ist, okay?
‫Um es jetzt zu testen,
‫loggen wir uns einfach über die Konsole die Daten ein.
‫Lassen Sie uns das nun tatsächlich testen.
‫Aber bevor wir
‫das tun, lassen Sie uns hier eigentlich noch die Ablagecodierung angeben, okay?
‫Also, ich bin mir nicht hundertprozentig sicher, ob
‫es ohne das funktioniert, also
‫bereinigen Sie das jetzt, führen Sie es erneut aus, und hier sehen wir, dass es gelesen wird.
‫Lassen Sie uns also noch einmal analysieren, was hier passiert ist.
‫Sobald diese Funktion hier ausgeführt wird, beginnt
‫sie im Hintergrund mit dem Lesen dieser Datei,
‫ohne die restliche Codeausführung zu blockieren.
‫Lassen Sie mich dies hier tatsächlich demonstrieren.
‫Also eine Konsole. log
‫wird die Datei lesen, und nur um dort ein bisschen weniger Verwirrung
‫zu haben, lassen Sie mich diesen Teil hier auskommentieren, okay.
‫Und was denkst du wird jetzt passieren?
‫Welches Protokoll werden wir zuerst sehen?
‫Und tatsächlich sehen wir zuerst die Datei
‫wird gelesen und erst dann sehen wir dies lesen.
‫Also nochmal, warum ist das passiert?
‫Wie ich bereits erwähnt habe, beginnt Node JS hier
‫im Hintergrund mit dem Lesen der Datei, blockiert
‫den Code nicht und geht dann sofort zur nächsten Codezeile über.
‫Und die nächste Codezeile, nun, es ist dieses Protokoll hier,
‫und das ist das
‫erste, was hier im Terminal protokolliert wird.
‫Erst dann, wenn eine Datei vollständig
‫gelesen ist, wird diese Callback-Funktion hier ausgeführt, okay?
‫Und wieder hat diese Callback-Funktion Zugriff auf den Fehler und die
‫gelesenen Daten, und wir könnten
‫das hier wirklich alles nennen, was wir wollten.
‫Wir könnten es auch Text nennen, es spielt keine
‫Rolle, es zählt nur, dass es das zweite Argument
‫in dieser Callback-Funktion ist.
‫Kommen wir zurück zu den
‫Daten, denn das gefällt mir besser.
‫Und so, nur dann, diese Konsole. log wird mit den Daten ausgeführt, also
‫mit dem Text, der in der Datei enthalten war.
‫Deshalb sehen wir dies hier als zweites Protokoll.
‫Nun gut, um es noch weiter
‫zu treiben, lassen Sie uns tatsächlich eine weitere Lesedatei erstellen, aber
‫stattdessen, damit ich Ihnen zeigen kann, dass
‫wir mit Rückrufen im Grunde mehrere Schritte nacheinander ausführen können.
‫Also Schritte, die vom Ergebnis des vorherigen Schrittes abhängen.
‫Okay, deshalb habe ich das eigentlich in der Startdatei gelesen,
‫denn dann
‫gibt es eine Datei namens read this, die
‫den Inhalt hat, der uns eigentlich interessiert.
‫Okay?
‫Also, was ich hier tun werde, ist diesen Code
‫zu kopieren und hier einzufügen.
‫Ich nenne dies Daten eins und dann Daten
‫zwei, und das Ergebnis des zweiten Schritts, also die zweite gelesene Datei,
‫hängt von der ersten ab.
‫Das liegt daran, dass wir die Daten für den Dateinamen verwenden, erinnern Sie sich?
‫Also, hier machen wir jetzt a (murmelt),
‫weil wir diese Variable eingeben müssen, und sie heißt data
‫one.
‫Okay, sinnvoll?
‫Also, Daten 1 wird gelesen, okay, und dann lesen wir
‫im nächsten Schritt txt/readthis. txt, das ist
‫dann diese.
‫Okay, und deshalb ist dieser Dateiname hier
‫derselbe wie dieser Inhalt.
‫Und das wird durch Konsolendaten dazu protokolliert.
‫Und lassen Sie uns schnell testen, ob dies funktioniert, und
‫das ist tatsächlich der Inhalt von Lesen Sie dies. TXT.
‫Und jetzt gehe ich tatsächlich noch einen Schritt weiter,
‫auch weil es in dieser Append-Datei noch anderen Text gibt,
‫den ich dieser ersten Zeichenfolge hinzufügen möchte, also kommt
‫Text aus der anderen Datei.
‫Und so haben wir noch
‫einen weiteren Schritt, der vom vorherigen
‫Schritt abhängt, also füge ich hier eine weitere Lesedatei hinzu.
‫Also einfach so.
‫Also, dieser hier heißt
‫append, und ich nenne diesen hier die Daten drei, hier die Daten drei,
‫und das ist wieder das Ausführen.
‫Und, okay, jetzt haben wir also diese beiden Ergebnisse hier.
‫Okay, und jetzt endlich, als letzten Schritt,
‫möchte ich diese beiden Strings zusammen in
‫eine Datei schreiben, okay?
‫Bisher haben wir nur Dateien
‫gelesen, aber ich möchte auch eine Datei
‫schreiben, also machen wir das auch hier.
‫Also, fs.
‫writeFile, und natürlich verwenden wir nicht die
‫synchrone Version
‫wie zuvor, sondern wie hier und hier und hier
‫verwenden wir die asynchrone Version, nicht die synchrone.
‫Also, TXT-Schrägstrich, fehlt dieser hier, endgültig.
‫Dann sollten wir auch hier die Textcodierung hinzufügen, und dann
‫akzeptiert diese auch eine Callback-Funktion, aber in diesem Fall
‫gibt es keine Daten, die wir lesen, und daher
‫brauchen wir keine zwei Argumente.
‫Das einzige Argument, das wir haben, ist der Fehler.
‫Okay, hier haben wir den Fehler und die gelesenen Daten, aber
‫hier in writeFile gibt es keine Daten.
‫Alles, was es gibt oder sein kann, ist ein Fehler, okay?
‫Und tatsächlich fehlt uns
‫hier etwas, was wir eigentlich in die Datei schreiben wollen.
‫Okay, und das ist das
‫zweite Argument, und das sind Daten zwei und Daten drei.
‫Also hier wieder
‫eine (murmelnde) Zeichenfolge,
‫Daten zwei, dann ein Zeilenumbruchzeichen, das wiederum Backslash
‫n ist, und dann Daten 3.
‫In Ordnung, und so, genau wie bei den Funktionen zum Lesen von Dateien,
‫wird dieser Callback am Ende ausgeführt. Ich werde hier also einfach
‫über die Konsole protokollieren, dass die Dateien geschrieben
‫wurden oder dass die Datei
‫vorhanden ist geschrieben worden.
‫Ihre Datei wurde geschrieben, und lassen Sie uns hier
‫einfach ein paar lustige Emojis verwenden, um
‫die Konsole für uns etwas heller
‫zu machen, und ich denke, wir sollten so vorgehen.
‫Löschen wir die Konsole noch einmal, führen Sie sie
‫aus, und wir sehen tatsächlich, dass Ihre Datei geschrieben wurde.
‫Also wirklich?
‫Finale.
‫Ach ja, hier ist es.
‫Das ist also der Read this text
‫und der append text, beide zusammen, beide in derselben Datei.
‫Okay, so führen wir also mehrere Schritte in Bestellungen durch,
‫indem wir Rückruffunktionen verwenden, richtig?
‫Denn stellen Sie sich vor, Sie haben einfach dieselbe Datei gelesen
‫und dann die zweite Datei gelesen,
‫also diese, direkt danach.
‫Nun, wie würden Sie dann auf die
‫Daten des ersten zugreifen, oder?
‫Und so entsteht dieses Muster.
‫Es hat tatsächlich
‫einen eigenen Namen, und ich glaube, ich
‫habe im letzten Video erwähnt, dass es
‫die sogenannte Callback-Hölle ist, und es gibt einige Lösungen, um diesen
‫Code hier lesbarer und verständlicher zu machen, aber
‫das tut es im Moment nicht für dich überhaupt wichtig.
‫Wichtig ist, dass Node JS auf
‫dieser Philosophie der Rückrufe basiert.
‫So implementiert Node JS asynchrone Operationen, indem
‫es Callbacks aufruft, sobald
‫die ausgeführte Operation abgeschlossen ist.
‫Und übrigens, diese Schreibweise, die Sie
‫hier sehen, ist, falls
‫Sie damit nicht
‫vertraut sind, auch die neue ES6-Syntax, okay?
‫Ich hoffe also, dass Sie an dieser
‫Stelle mit ES6 vertraut sind
‫und dass dies alles für Sie völlig sinnvoll ist.
‫Wenn Sie diese Funktion hier
‫ohne die Syntax der Fehlerfunktion schreiben würden,
‫würden wir einfach so machen, Funktion, Fehler, Daten eins und
‫dann so.
‫Das ist also
‫eine normale Funktion, sagen wir eine
‫altmodische Funktion, und die neue Version funktioniert so.
‫Der Unterschied zwischen ihnen ist hauptsächlich die Syntax,
‫aber auch die Tatsache, dass eine
‫Fehlerfunktion, also diese
‫Art von Funktion, kein eigenes
‫Disk-Schlüsselwort erhält, sondern das Disk-Schlüsselwort der Elternfunktion verwendet.
‫Und das nennt man das lexikalische Disk-Schlüsselwort,
‫während eine normale Funktion wie
‫diese immer ihr eigenes Disk-Schlüsselwort bekommt, oder?
‫Ich bin sicher, Sie kennen sich mit solchen
‫Dingen aus, aber machen Sie hier eine kleine Rezension, falls Sie es nicht sind.
‫Okay, ich hoffe das hat sich da gemacht.
‫Wir haben diesen Fehler eigentlich nie verwendet, wir haben
‫keine Fehler behandelt, also stellen
‫Sie sich zum Beispiel vor, dass diese Datei hier nicht existiert.
‫Nun, wir hätten diesen Fehler verwenden können,
‫und das machen wir tatsächlich, aber nur für diesen hier, also
‫möchte ich nicht alle diese Fehlerhandler hier erstellen, sondern nur in dieser Situation,
‫sagen wir, es ist ein Fehler aufgetreten, und so
‫Sagen wir, wenn Fehler, die Rückkehr
‫von dieser Funktion, also nichts anderes tun, und
‫sich an der
‫Konsole anmelden, Fehler, und dann können wir hier einige andere Emojis hinzufügen,
‫wie diese Explosion, also etwas, das hier explodiert ist.
‫Also, lass uns das jetzt hier ändern, wie start. txt, führen Sie dies erneut aus,
‫und so
‫haben wir jetzt diesen Fehler, also gibt es uns dieses
‫Protokoll an die Konsole, und da wir
‫zurückgekehrt sind, wird es danach nichts mehr tun, also wird
‫all dies im Grunde ignoriert und wird nicht ausgeführt ,
‫genau das wollen wir.
‫Richtig, aber wenn wir es wieder normalisieren
‫und dann
‫erneut ausführen, dann funktioniert alles wie zuvor.
‫Gewöhnen Sie sich also an dieses Muster von Rückrufen,
‫denn Sie werden es überall in Node JS
‫und in diesem Abschnitt sehen.