Am 14. September 2017 haben wir eine überarbeitete Fassung unserer Datenschutzrichtlinie veröffentlicht. Wenn Sie video2brain.com weiterhin nutzen, erklären Sie sich mit diesem überarbeiteten Dokument einverstanden. Bitte lesen Sie es deshalb sorgfältig durch.

JavaScript: Asynchrone Programmierung

Hilfsbibliotheken

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Bibliotheken wie Q.JS bieten eine Promise-Implementierung sowie einige besondere Konventionen, die sich als nützlich erwiesen haben.

Transkript

Über die Jahre hinweg haben sich diverse Implementierungen für die Benutzung von Promises etabliert. Die wohl wichtigste ist Q-JS, eine Alternative zur aktuellen im JavaScript Standard verfügbaren Promise Implementierung. Was genau Q-JS anders macht, oder besser kann, werde ich Ihnen im Folgenden demonstrieren. Für diesen Zweck lege ich in meinem Projekt eine neue Datei mit Bezeichnung 05_q.js an. Außerdem muss ich nun in meinen Projekt Abhängigkeiten, mit npm install, minus, minus, save, die Bibliothek Q installieren. Die Benutzung von Q ist ähnlich wie bei anderen NodeJS Bibliotheken, über den Befehl require, q. Außerdem benötige ich für mein Beispiel noch die Bibliothek request, und schon kann ich durchstarten. Um nun beispielsweise aus einer regulären, statischen Zahl, ein Promise zu erzeugen, reicht es Q, Klammer auf, Klammer zu, und den jeweiligen Wert zu verwenden. Beispielsweise 1. In dem Moment habe ich alle Möglichkeiten, die für ein Promise üblich sind. Beispielsweise kann ich also mit der then Funktion, die console.log Funktion starten. Anders als bei einem regulären Promise, habe ich bei Q, allerdings auch eine Funktion mit dem Bezeichner done. Dieser soll letztendlich das Ende einer Promise Chain markieren, hat aber für dieses Beispiel hier, den genau gleichen Effekt. Dieses done kann allerdings mehr als nur eine Callback Funktion entgegennehmen. Beispielsweise kann ich nun eine Funktion done definieren, die einen Wert entgegennimmt, und auf der Konsole Done: und den Wert ausgibt. Außerdem definiert Q.js eine sogenannte Progress Callback Funktion, diese würde also immer dann informiert werden, wenn es Zwischenergebnisse gibt, als auch den Fehlerfall. Für den Aufruf von done bedeutet das also, dass ich zunächst einmal die done Funktion übergebe, daraufhin die Progress Funktion, und dann die error Funktion. Das Ergebnis bleibt zunächst einmal das Gleiche, allerdings wird nun explizit die done Funktion aufgerufen. Standardmäßig muss ich mich bei Q, nicht so sehr mit der setTimeout Funktion auseinandersetzen, denn es gibt die Möglichkeit über Q.delay, automatisch ein Promise zu erzeugen, das auf setTimeout basiert. Daraufhin kann ich dann beispielsweise eine Zahl erzeugen, wie die Zahl 2, und mit dem Aufruf von done, progress und error, den Wert zurückgeben. In diesem Fall war meine IDE so freundlich mich vorzuwarnen, dass die Funktion tatsächlich err heißt. Auch beim Kapseln einer regulären Callback Funktion, wie beispielsweise request, kann ich relativ intuitiv statt return new Promise, die Funktion Q.Promise benutzen, um ein Q-typisches Promise zu erzeugen. Darauf basierend kann ich mir nun beispielsweise eine Funktion bauen, mit der Bezeichnung httpbin, die eine URL entgegennimmt, und mit der requestPromised auf die URL, mir zusätzlich die Möglichkeit gibt, über die Funktion tap, mitzuschreiben wann immer ein Aufruf gemacht wird und was der Rückgabewert ist. In diesem Beispiel also die Möglichkeit mit der console.log Funktion, aus der Variable res, und dort dem httpIncomingResult, den jeweiligen Statuscode auf die Konsole auszugeben. Dadurch beeinflusse ich mein Resultat also nicht, ganz im Gegensatz zu einem regulären Aufruf von then, der mein Ergebnis unter Umständen umwandeln kann. Wenn ich hier nun also mit dem then, das Ergebnis entgegennehme, und mit der Funktion JSON.parse, auf res.body, die Zahl aus den Argumenten ziehe, habe ich später nicht mehr die Möglichkeit, den Statuscode abzufragen. ƒhnlich wie das reguläre Promise, kann ich hier eine Funktion Q.all benutzen, um darauf zu warten, dass alle Promises ihr Resultat geliefert haben. Beispielsweise also für den Aufruf von httpbin, auf die URL https://httpbin.org, /get?req=1. Und das Gleiche noch einmal: für request2. Danach kann ich das Ganze auf die Konsole ausgeben, und meine Promise Chain beenden. Im Log sehen wir nun den Statuscode, der auf der tap Funktion zurückgegeben wurde. Wenn einer dieser Aufrufe nun fehlerhaft ist, führt das dazu, dass Q-JS einen allgemeinen Fehler auslöst und das komplette Programm beendet. Damit verhält es sich anders als typische JavaScript Promises, die Fehler unter Umständen verschlucken können. Erst dann wenn ich sicherstelle, dass der Fehler gefangen wird, beispielsweise durch die Aufrufe auf der done Funktion, erst dann wird nicht ein Fehler ausgelöst, der die ganze Anwendung beendet. Das Verhalten der all Funktion bedeutet immer, dass alle Promises, die hier definiert sind, beendet sein müssen, um den console.log auszulösen. Und zwar positiv. Möchte ich allerdings, dass egal was passiert, der Aufruf weitergeleitet wird an die console.log Funktion beispielsweise, kann ich alternativ dazu, die Funktion Q.allSettled benutzen. AllSettled steht hier dafür, dass wir lediglich erwarten, dass es irgendeine Form von Resultat auf den Promises gibt, ob es nun eine rejection oder ein resolve ist. Im allSettled Fall bekommen wir zunächst einmal das Argument eines arrays, in dem nun die zwei Promises drin stehen, wo jeweils das erste Promise in dem Fall rejected ist und das zweite Promise fulfilled. Anders als der reguläre JavaScript Standard und dessen Promise, bietet uns Q-JS also einige Zusatzfunktionalitäten. Dazu gehören zum einen die Möglichkeit Zwischenstände zurückzugeben, oder auch die Fähigkeit besser mit Fehlersituationen umzugehen, wie beispielsweise in der Funktion allSettled. Die Hilfsfunktionen von Q-JS helfen dabei, reguläre Callback APIs in Promises umzuwandeln. Einige der Standardanwendungsfälle für Promises sind in Q-JS direkt abgebildet, wie beispielsweise das Abbilden von Wartezeiten, mit der Q.delay Funktion, oder auch Zwischenstufen zu definieren, für beispielsweise logging Zwecke, die keinen Einfluss auf den Ablauf der Promises haben.

JavaScript: Asynchrone Programmierung

Lernen Sie Lösungen für die komplexe Anwendungsentwicklung kennen, um zeitaufwändige Ressourcenzugriife im Code zu vermeiden.

2 Std. 30 min (19 Videos)
Derzeit sind keine Feedbacks vorhanden...
 
Software:
Exklusiv für Abo-Kunden
Erscheinungsdatum:22.08.2016

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!