‫Kursleiter: In diesem Video werden wir die
‫Funktionen zum Lesen von Dateien und zum Schreiben von Dateien versprechen.
‫Das bedeutet, dass wir sie so gestalten,
‫dass sie Versprechen
‫zurückgeben, anstatt dass wir ihnen eine Rückruffunktion übergeben.
‫Wenn Sie möchten, ist es im Grunde eine Funktion
‫zum Lesen einer Datei,
‫die ein Versprechen zurückgibt und nur einen Dateinamen empfängt, keinen Rückruf.
‫Machen wir also genau das.
‫Wir werden also eine Funktion zum Lesen von Dateien erstellen.
‫Also Pro für Versprechen, weil es
‫wieder ein Versprechen zurückgibt.
‫Und dann geben wir nur noch
‫den Dateinamen ein und geben, wie gesagt, ein Versprechen zurück.
‫Also, neues Versprechen zurückgeben.
‫Daher verwenden wir hier den Promise-Konstruktor,
‫der mit ES6 in die Sprache eingeführt wurde.
‫Vor ES6 wie ES5, ES4 und allen
‫vorherigen Versionen
‫gab es also keine Unterstützung für Versprechen in JavaScript.
‫Aber sie haben das in ES6
‫geändert und die Sprache in dieser Hinsicht viel besser gemacht.
‫Also in Bezug auf asynchrones JavaScript.
‫Nun nimmt dieser Promise-Konstruktor
‫hier eine sogenannte Executor-Funktion auf, die
‫sofort aufgerufen wird, wenn Promise erstellt wird.
‫Und diese Funktion wird zwei Argumente annehmen, also
‫auflösen und ablehnen.
‫Also entschließe dich und lehne
‫ab, aber mach dir jetzt keine Sorgen um
‫sie, wir werden gleich über sie sprechen.
‫Konzentrieren wir uns vorerst nur auf diese Executor-Funktion
‫selbst, denn hier erledigen wir eigentlich
‫all diese asynchronen Arbeiten.
‫In diesem Fall funktioniert die gelesene Datei.
‫Hier werden wir also fs nennen. readfile
‫mit dem übergebenen Dateinamen
‫und dann die übliche Callback-Funktion, ok.
‫Also der Fehler und die Daten, also genau
‫wie zuvor.
‫Denken Sie also daran,
‫dass wir die Dateilesefunktion nicht wirklich ändern,
‫sondern einfach eine neue Funktion
‫erstellen, die hinter den Kulissen natürlich immer noch
‫die eingebaute Dateilesefunktion ausführt, aber dann ein
‫Versprechen zurückgibt, damit wir
‫stattdessen das
‫Versprechen verwenden können der Callback-Funktion.
‫Okay.
‫Wir haben hier also diese Datei lesen-Funktion,
‫die ihre Arbeit verrichtet
‫und, wenn sie fertig ist, mit den Daten zurückkommt.
‫Und jetzt kommen hier
‫die Auflösungs- und die Ablehnungsfunktion ins Spiel.
‫Da diese beiden Argumente, die
‫in der Executor-Funktion verfügbar sind, beide Funktionen sind.
‫Nun wird das Aufrufen
‫der Auflösungsfunktion das Promise im Grunde als erfolgreich markieren,
‫also als
‫erfüllt, und den erfolgreichen Wert aus dem Promise zurückgeben.
‫Also lass uns das tatsächlich tun.
‫Also nennen wir Auflösung mit Daten.
‫Welche Variable wir also an die Auflösungsfunktion übergeben,
‫wird später als Argument
‫in der Methode then verfügbar sein, in Ordnung?
‫Diese Daten hier werden also der Wert
‫sein, den dieses Versprechen an uns zurückgibt, okay.
‫Das klingt wahrscheinlich etwas verwirrend, oder?
‫Alles, was wir hier an diese Funktion übergeben, an
‫die Auflösungsfunktion, ist
‫also das Ergebnis des
‫Promises, das im then-Handler verfügbar sein wird.
‫Auf der anderen
‫Seite können wir die Zusage jetzt auch als abgelehnt markieren,
‫falls ein Fehler aufgetreten ist, okay.
‫Und das tun wir,
‫indem wir, wie
‫Sie sich wahrscheinlich denken können, die Ablehnungsfunktion aufrufen.
‫Wenn also ein Fehler aufgetreten
‫ist und dies ähnlich ist wie zuvor.
‫Wenn hier also ein Fehler
‫aufgetreten ist, rufen Sie die Ablehnungsfunktion auf.
‫Und was immer wir in dieses
‫eingeben, ist der Fehler, der
‫später in der catch-Methode verfügbar ist.
‫Also in diesem hier.
‫Okay?
‫Also lasst uns hier einfach einen
‫String übergeben, ich konnte diese Datei nicht finden, ein paar Emojis hier
‫vielleicht, damit sie in unserer Konsole ein bisschen
‫mehr auftaucht. Protokolle, in Ordnung?
‫Und, okay.
‫Das ist es eigentlich schon.
‫Lassen Sie uns dies hier noch einmal überprüfen.
‫Also haben wir eine
‫neue Datei erstellt, in der wir einen Dateinamen übergeben.
‫Also dieses Argument.
‫Und alles, was wir hier tun, ist dieses Versprechen zurückzugeben.
‫Dieses Versprechen beinhaltet eine Executor-Funktion, also
‫diese hier,
‫wo wir unsere asynchrone Arbeit erledigen.
‫Dann ist das hier natürlich unser
‫fs. Readfile.
‫Wenn wir unsere Daten dann erfolgreich erhalten,
‫rufen wir die
‫Auflösungsfunktion mit dem Auflösungswert auf.
‫Und wenn ein
‫Fehler auftritt, rufen wir die Ablehnungsfunktion auf, okay?
‫Lassen Sie uns dies nun in der Praxis anwenden.
‫Read file pro übergeben
‫wir unseren Dateinamen.
‫Das ist natürlich dieser
‫und das war's.
‫Dies wird nun also ein Versprechen zurückgeben.
‫Und genau wie
‫zuvor können wir dann unsere Dann-Methode darauf anwenden.
‫Okay, und dieses Datenargument hier wird genau das sein,
‫was wir aus dem Versprechen zurückgegeben haben, falls
‫es erfolgreich war.
‫Also, mit dieser Entschlossenheit.
‫Im Moment enthält unsere
‫Hundedatei hier Labrador
‫und diese Daten hier werden Labrador sein.
‫Und so ist das dann später in
‫unserem damaligen Handler hier verfügbar.
‫Aber natürlich muss es nicht den gleichen Namen haben,
‫ich könnte es auch wie result
‫nennen oder so ist es egal, okay?
‫Okay, also lasst uns das alles jetzt nehmen und
‫es tatsächlich hier platzieren.
‫Okay.
‫Beseitigen Sie all dies, speichern Sie es
‫und das wird ausgeführt.
‫Jetzt bekommen wir diesen Fehler hier unten,
‫also sind die Daten nicht definiert.
‫Das liegt daran, dass ich es hier in ein Ergebnis geändert habe.
‫Gehen wir also zurück und ändern Sie es in
‫Daten, denn hier haben
‫wir Daten
‫und hier haben wir Daten und auf
‫diese Weise muss ich nicht alle diese Variablennamen ändern.
‫Geben Sie es noch einmal
‫speichern und los geht's.
‫Es hat also funktioniert, verstehst du?
‫Wir haben tatsächlich die Rasse
‫bekommen, die immer
‫noch Labrador ist und diesmal von unserem Versprechen, okay.
‫Das hat also wirklich funktioniert.
‫Unsere Funktion read file pro
‫gibt jetzt also
‫ein Promise zurück und diese Daten hier sind dann auf unserem then-Handler verfügbar.
‫Großartig, also funktioniert es bereits und
‫wir können es viel
‫besser machen
‫und das werden wir tun, aber vorerst möchte ich
‫auch diese Funktion zum Schreiben von Dateien hier versprechen.
‫Machen Sie also im Grunde
‫dasselbe wie bei der Funktion Datei lesen.
‫Wenn Sie sich jetzt schon ein
‫wenig mit no js auskennen, denken Sie vielleicht, dass es tatsächlich
‫einen Funktionsknoten gibt, der uns automatisch Funktionen verspricht.
‫Aber natürlich wollte ich euch hier
‫zeigen, wie Versprechen tatsächlich funktionieren
‫und wie
‫wir sie bauen und deshalb mache ich das alles hier, okay.
‫Deshalb möchte ich wirklich, dass Sie etwas über Versprechen lernen, nicht
‫nur, wie wir sie konsumieren, sondern
‫auch, wie man sie baut.
‫Und deshalb mache ich es so.
‫Also, schreiben Sie Datei und als Versprechen.
‫Und dieser braucht tatsächlich nicht nur den Dateinamen,
‫sondern auch die Daten, die in diese Datei geschrieben werden sollen.
‫Aber dann ist die Logik hier ganz ähnlich.
‫Also geben wir wieder ein neues
‫Versprechen zurück, darin haben wir
‫unsere Executor-Funktion, die als Argument auflösen und ablehnen nimmt.
‫Und dies sind eine Art
‫Standardnamen. Also entschließen Sie sich und
‫lehnen Sie ab, Sie könnten sie nennen, wie Sie
‫wirklich wollten, aber das ist so etwas wie der Standard, okay.
‫Also fs,
‫write
‫file, wir übergeben die
‫Datei, die Daten und dann die Callback-Funktion.
‫Und jetzt etwas sehr Ähnliches wie zuvor. Wenn
‫also ein Fehler aufgetreten
‫ist, rufen Sie die Ablehnungsfunktion auf und geben
‫Sie dort eine Nachricht ein.
‫Konnte die Datei
‫nicht schreiben, wieder mit diesem Emoji hier, um es ein
‫bisschen mehr hervorzuheben und falls alles gut
‫funktioniert hat, dann einfach lösen.
‫Jetzt haben wir keine Daten, die wir hier wirklich weitergeben müssen, oder?
‫Also geben wir einfach eine zufällige
‫Zeichenfolge ein, etwa wie "Erfolg", okay.
‫Ein Versprechen muss
‫also nicht immer einen sinnvollen Wert zurückgeben.
‫In diesem Fall versuchen wir hier
‫nur, eine
‫Datei zu schreiben, die keinen wirklich sinnvollen Wert zurückgibt.
‫Wir sind jetzt also bereit, diese versprochene Funktion zu verwenden, aber
‫bevor wir
‫das tun, implementieren wir die Verkettung, über
‫die ich zuvor gesprochen habe.
‫Im Moment
‫haben wir also tatsächlich immer noch Rückrufe innerhalb von
‫Rückrufen innerhalb von Rückrufen, oder?
‫Also haben wir
‫das, was diesen Rückruf hat.
‫Und dann gibt es dort einen weiteren Then-Handler,
‫der noch einen weiteren Callback enthält.
‫Das ändert also nicht wirklich etwas, oder?
‫Stattdessen wollen wir diese Then-Handler hier verketten.
‫Und das Geheimnis
‫dabei ist, dass jeder Handler ein neues Versprechen zurückgibt.
‫Also, wie sollen wir das machen?
‫Denken Sie daran, dass diese Funktion hier ein Versprechen zurückgibt.
‫Alles, was wir tun
‫müssen, ist, dieses Versprechen von diesem Erst- und dann Handler zurückzugeben.
‫Lass mich dir das zeigen.
‫Also sagen wir Return-Superagent. bekommen und dann
‫die Zeichenfolge und das ist jetzt ein Versprechen, okay.
‫Und dann schließen wir tatsächlich diese
‫Callback-Funktion hier und verketten diese Methode dann direkt daran.
‫Speichern Sie es, jetzt haben wir hier einen Fehler
‫und das ist in Zeile 40.
‫Lass uns das hier loswerden
‫und okay.
‫Es hat die Formatierung hier für
‫uns wieder geändert, die
‫schöner war und dann haben wir es hier unten eigentlich schon funktioniert.
‫Warum funktioniert das dann wieder?
‫Nun, natürlich gibt diese Funktion, die wir am
‫Anfang erstellt haben, ein Versprechen zurück.
‫Darauf können wir die Methode then anwenden.
‫Wir lassen dann diese Callback-Funktion, die darin
‫enthalten ist, wieder ein Versprechen zurückgeben.
‫Und so können wir
‫dann den nächsten Handler daran verketten.
‫Diese Ergebnisvariable hier
‫wird also der aufgelöste Wert dieses Versprechens
‫sein, das vom vorherigen Handler zurückgegeben wurde, okay?
‫Macht Sinn?
‫Um noch einen Schritt weiter
‫zu gehen,
‫werden wir jetzt auch hier unsere Funktion write file pro verwenden.
‫Und da wir die Then-Methoden weiterhin verketten wollen,
‫werden wir das tatsächlich wieder zurückgeben.
‫Also zurück, schreibe file pro pass in
‫den Dateinamen, das ist dieser, die
‫Daten...
‫Und das ist es tatsächlich.
‫Okay, das brauchen wir hier nicht mehr, lass es
‫uns erst einmal kommentieren.
‫Entfernen Sie diesen Raum
‫hier und dann können wir den nächsten Handler verketten.
‫Also dann, und denken Sie
‫daran, dass wir hier drinnen keinen wirklich sinnvollen Wert hatten.
‫Wir wollen hier
‫also kein Argument für
‫diese Callback-Funktion, wir wollen nur diesen String protokollieren, oder?
‫Jetzt können wir das also wirklich
‫loswerden und okay.
‫Also, hier unten sehen wir
‫jetzt, dass es tatsächlich schon funktioniert.
‫Und wieder besteht der Trick,
‫um alle diese Methoden hier verketten zu können,
‫darin, ein Versprechen zurückzugeben, bevor jede von ihnen aufgerufen wird.
‫Dieser hier gibt also offensichtlich ein Versprechen zurück, damit
‫wir dann die Methode then verketten können.
‫Dann gibt dieser Code
‫hier ein Versprechen
‫zurück und wir können es dann verwenden.
‫Dann gibt dieses Stück Code
‫ein Versprechen zurück und wir können es dann wieder verwenden, okay?
‫Das ist also das Geheimnis.
‫Sparen Sie noch einmal
‫und hier unten sehen wir, dass die Rasse immer noch Labrador ist.
‫Wir sehen, dass dies hier der Link ist, gehen
‫wir hierher und bestätigen Sie, dass dies hier
‫tatsächlich dasselbe ist wie dieses.
‫Und so hat es den String mit unserer versprochenen Funktion zum
‫Schreiben von Dateien erfolgreich in die Textdatei geschrieben, okay.
‫Und am Ende haben wir dann diesen Fehlerhandler.
‫Und das Schöne daran ist, dass wir am Ende für
‫all diese Ketten-
‫und Handler einfach nur einen einzigen Catch-Handler brauchen.
‫Also eine Funktion, die
‫die Fehler behandelt, die von einem der drei Versprechen stammen, okay.
‫Lassen Sie uns eigentlich nur den Fehler in der
‫Konsole protokollieren und versuchen
‫wir beispielsweise, diese Datei hier zu ändern.
‫Eigentlich nicht die Datei,
‫aber ich werde den Dateinamen hier ändern, speichern und
‫jetzt sehen wir, dass ich diese Datei nicht finden konnte.
‫Also woher kommt das?
‫Es kommt direkt
‫hierher, wenn Sie die Ablehnungsfunktion aufrufen, okay?
‫Wir haben hier also einen Fehler, weil wir die Datei
‫nicht finden konnten und haben die Ablehnungsfunktion aufgerufen.
‫Und diese Zurückweisungsfunktion markiert dann dieses Versprechen hier, also denken Sie daran,
‫dass dies ein Versprechen ist.
‫Es wird als abgelehnt markiert.
‫Und deshalb wird die catch-Funktion aufgerufen.
‫Und dann protokollieren wir diesen Fehler in der Konsole.
‫Und das Ergebnis davon können Sie hier unten sehen.
‫Okay, legen wir es zurück, jetzt funktioniert
‫es.
‫Jetzt gehen wir in die Datei,
‫erstellen einen Hund, der nicht existiert
‫und jetzt, oh, hier haben wir diesen großen seltsamen Fehler und das liegt daran,
‫dass wir einfach den gesamten Fehler protokollieren und nicht die
‫Fehlermeldung, wie wir es zuvor getan haben, aber es tut?
‫ist egal.
‫Jetzt speichern Sie es jetzt hier,
‫legen Sie
‫es zurück und gut.
‫Jetzt funktioniert alles und
‫wir haben diese dreieckige Form, die
‫wir in unserem
‫Code hatten, losgeworden und haben jetzt eine sogenannte flache Struktur von Kettenversprechen.
‫Dies ist also wiederum viel einfacher
‫zu verwalten und ich hoffe, Sie können das
‫zu schätzen wissen und es ist auch
‫logischer, über den Code so nachzudenken und zu argumentieren.
‫Nun, im
‫nächsten Vortrag werden wir tatsächlich noch einen
‫Schritt weiter gehen und es
‫noch lesbarer und benutzerfreundlicher machen.
‫Also bleib dran.