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.

Scala Grundkurs

Promise

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Das Promise ist in Scala die Basis eines Futures. Wird also in Scala ein Future benutzt, wird im Hintergrund tatsächlich ein Promise verwendet. Sie können aber auch direkt ein Promise erzeugen, um so einen Wert für einen Future direkt zur Verfügung zu stellen.

Transkript

Das Promise ist in Scala die Basis eines Future. Das heißt, wann immer man ein Future nutzt, nutzt man im Hintergrund tatsächlich ein Promise. Nichtsdestotrotz kann es auch Sinn machen, ein Promise für die eigenen Zwecke einzusetzen, denn Promises lösen andere Problemstellungen als Futures. So sind Futures beispielsweise immer unmittelbar zu erzeugen, denn sie basieren auf dem Rückgabewert des Blocks, den sie ausführen. Und bei einem Promise kann ich einen Wert für ein solches Future zu jedem beliebigen Zeitpunkt bereitstellen. Das kann auch durch externe Signale passieren, vor allem also immer dann, wenn ich innerhalb meines Programmflusses nicht unter Kontrolle habe, wann ein Wert zur Verfügung steht. Ich zeige Ihnen nun beispielhaft, wie Sie Promises anwenden können. Ich befinde mich nun also in meiner Applikation, die die PaymentApi und dort den Aufruf charge2 ausführt. Dieser Aufruf erzeugt aktuell ein Future und liefert dann einen Rückgabewert, der aktuell auf die Konsole ausgegeben wird. Wenn ich diese PaymentApi also ausführe, erhalte ich den HTTP-Inhalt "200 OK". Das Ganze kann ich nun, statt mit einem Future auch mit einem Promise abbilden. Zunächst einmal entferne ich hier diesen Ausdruck und das Future. Als nächstes erzeuge ich nun ein Promise. Das ist relativ einfach durch den Aufruf von "Promise", das sich innerhalb des Paketes "scala.concurrent" befindet. Ich definiere nun noch einen Typ für mein Promise. In dem Fall ist also der Ausgabewert dieser Funktion hier "String". Ein Promise kann ich nun in ein Future umwandeln, denn üblicherweise arbeite ich bei der Interaktion zwischen verschiedenen Funktionen nicht mit Promises, sondern weiterhin mit Futures. Allerdings erlaubt mir dieses Promise nun, zu einem beliebigen Zeitpunkt in der Zukunft den Inhalt des Promise festzulegen. Dafür gibt es auf dem Promise eine API, die sich "Success" nennt. Diese kann ich beispielsweise aufrufen mit dem Inhalt "Hello World". Wenn ich also nun meine PaymentApi starte, gibt es die Ausgabe "Hello World", denn das Future von PaymentApi.charge2 wird aktuell durch dieses Promise fulfilled. Mit dem ersten Aufruf von einem Success ist dieses Promise damit auch fulfilled und kann nicht mehr verändert werden. Das heißt, beim zweiten Aufruf von Success wird ein Fehler entstehen, denn es ist mir nicht erlaubt, ein Promise, das bereits einmal fulfilled wurde, noch einmal zu fulfillen. Des Weiteren kann ich auf einem Promise später auch prüfen, ob es bereits completed ist, das heißt ich müsste dann entsprechend kein Success mehr ausführen. Üblicherweise nutzt man ein Promise auch eher auf der Klassenebene als innerhalb einer Funktion beziehungsweise Methode. Wenn ich dies nun mit meinem ursprünglichen Anwendungsfall verwenden möchte, kann ich hier den Code hinein kopieren. Das Problem an der Stelle ist, dass dieser Code immer noch blockierend ist. Das bedeutet, dass meine Anwendung an sich hier nicht parallelisiert ist, denn der Aufruf von promise.success wartet darauf, dass der Inhalt hier von dieser API geliefert wird. Um das Ganze hier korrekt zu implementieren, müsste ich also nun einen Thread erzeugen. Innerhalb dieses Threads müsste ich dann durch den Aufruf von: "promise.success" den Rückgabewert an das Promise liefern. Nun ist meine Anwendung tatsächlich wieder parallelisiert. Allerdings habe ich hier einige größere Fehler begangen, denn ich sollte beispielsweise nicht für jeden Aufruf immer einen neuen Thread erzeugen. Genau für diese Mechanismen hat Scala ja auch das Future geschaffen, das im Hintergrund mit einem Thread-Pool arbeitet. Deshalb rate ich davon ab, innerhalb eines so gestalteten Konstruktes Promises zu nutzen. Ein Promise ist also eine sehr praktische Datenstruktur, um den Zeitpunkt, an dem ein Future erfüllt werden soll, festzulegen. Die Besonderheit ist nämlich, dass ein solches Promise auch in ein Future umgewandelt werden kann. Daher besteht die API-Kompatibilität zwischen solchen Fällen, in denen ich ein Future verwenden möchte, und solchen Fällen, in denen ich dafür ein Promise verwenden möchte. Die Idee, dass man ein solches Promise zu einem beliebigen Zeitpunkt erfüllen kann, Sollte vor allem dann genutzt werden, wenn man Signale von außen bekommt, die man selbst nicht kontrolliert, aber auf die man warten muss. Normalerweise sollte man dann auch überprüfen, ob man das Promise bereits einmal erfüllt hat. Denn, wenn man das Promise ein zweites Mal erfüllen möchte, wird es zu einer Fehlermeldung kommen.

Scala Grundkurs

Entdecken Sie die Möglichkeiten und Eigenschaften der modernen Programmiersprache Scala.

4 Std. 44 min (39 Videos)
Derzeit sind keine Feedbacks vorhanden...
 
Exklusiv für Abo-Kunden
Erscheinungsdatum:12.04.2017

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!