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

Operationen mit Futures

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Mit Futures können Operationen durchgeführt werden, die den allgemeinen Umgang mit Futures innerhalb einer Anwendung auch außerhalb von Multithreading besser gestalten können. Das mag im ersten Moment etwas verwirrend klingen, aber dieser Film bringt schnell Licht ins Dunkel.

Transkript

Futures sind ein mächtiges Werkzeug innerhalb von Scala. Und um dieses Werkzeug richtig einzusetzen, möchte ich Ihnen noch einige Operationen an die Hand geben. Ich befinde mich nun also in einer Anwendung, die über die PaymentAPI ein solches Future generieren kann. Durch Aufrufen der PaymentAPI charge1 oder charge2. Doch was ist nun eigentlich, wenn ich beide APis aufrufen möchte? Üblicherweise müsste ich nun PAymentAPI .charge1 aufrufen und damit arbeiten und zusätzlich charge2. Was ist allerdings, wenn ich den Ausgang beider APis erwarten möchte? Dafür gibt es ein besonderes Konstrukt, das ich mit Hilfe von Future. Sequence aufrufen kann. Future. Sequence erwartet nun also eine Liste von Futures. Diese übergebe ich beispielsweise in Form von... dem Aufruf PaymentAPI.charge1 und dem Aufruf PaymentAPI.charge2. Als nächstes definiere ich also einen Completion Händler. Und prüfe zunächst einmal auf Success. In dem Fall bekomme ich also nun erstmal eine Sequence mit den aufgelösten Futures. Also in dem Fall die beiden Texte, die von den APis geliefert werden. In meinem Fall also Text1 und Text2. So kann ich das Ganze dann auch auf die Konsole ausgeben für die API 1, also Text1 und für die API 2 Text Nummer 2. Sollte es zu einem Fehler kommen, kann ich diesen auch gemeinsam für alle Futures auswerten durch den Ausdruck Failure und der aufgetretenen Exception. Genau diese gebe ich dann auch auf die Konsole auf als error occured. Als nächstes starte ich nun diese Anwendung und sehe also, dass es hier zu einem Problem kam. Aktuell ist ja die API 1 so gestaltet, dass sie immer einen Fehler ausliefert da sie einen Statuscode von 500 erhält. Das Problem ist, dass bei einer solchen Future-Sequence-Auswertung es nicht möglich ist auseinander zu halten, bei welchem der beiden Futures genau das Problem aufgetreten ist. Genau so wenig ist erkennbar, ob das zweite Future also PaymentAPI charge2 funktioniert hat oder nicht. Genau aus diesem Grund sollte man sich hier in Acht nehmen. Üblicherweise sollte man die Fehlerbehandlung also nicht mehr gemeinsam für beide tun Sondern man sollte jede Fehlerbehandlung für sich betrachten. Das bedeutet also, dass ich nach der PaymentAPI Charge 1 einen eigenen recovery Händler baue, so dass ich sicher sein kann, dass alle Futures, die sich innerhalb dieser Sequence befinden auch tatsächlich immer funktionieren. Andernfalls tue ich mich schwer dabei auseinander zu dividiere, wo ein Problem aufgetreten ist und wo nicht. Mache ich nun beispielsweise einen erfolgreichen Aufruf daraus, indem ich zum Beispiel die API charge2 zweimal aufrufe, erhalte ich jeweils das korrekte Ergebnis. Und in dem Moment kann ich auch erkennen, welche der beiden APls welchen Rückgabewert liefert. Eine andere Problemstellung, der man oft begegnet, ist wie man eine solche API hintereinander ausführen kann. Das bedeutet also, wie kann ich das Ergebnis des ersten Aufrufs für einen Aufruf Nummer 2 nutzen. Die erste intuitive Art und Weise dies zu lösen, wäre nun also ein Aufruf der PAymentAPI, beispielsweise Charge 2 und dann basierend auf dem Ergebnis dieses Aufrufs die PaymentAPI Charge 1 aufzurufen. Das einzige Problem nun ist, dass ich nicht mehr auswerten kann, was beim Aufruf von Charge 1 rauskommt. Denn nach dem foreach endet nun diese PaymentAPI. Das ist also nicht das richtige Konstrukt, um dieses Problem zu lösen. Eine andere intuitive Art das zu lösen, wäre also wiederum ein Aufruf der PAymentAPI Charge 2 und dann eines Mappings. Ich könnte also das Ergebnis des ersten Aufrufs Mappen und beispielsweise in einen Aufruf von Charge 1 umwandeln. Das einzige Problem hier nun ist, dass wenn ich das Endergebnis auswerten möchte, ich zunächst einmal wieder ein Future erhalte, denn ich habe nichts weiter getan als ein Future in ein Future zu packen. Also in diesem Fall müsste ich nun nochmal ein foreach Aufruf machen, so das sich tatsächlich endgültig den String bekomme. Das kann ich nun beispielsweise tun und für dieses Beispiel nutze ich auch hier die korrekt funktionieren API. Und ich bekomme auch das richtige Ergebnis. Allerdings ist die Form dieser API nicht sehr schön. Was man nun stattdessen tatsächlich tut, ist einen Flatmap zu verwenden. Also ich rufe wiederum die API Charge 2 auf und statt Map verwende ich nun Flatmap. Der Unterschied ist nun, dass ich nun kein Future eines Futures erhalte, sondern lediglich den echten Wert. Also kann ich diesen auch direkt auf die Konsole ausgeben. Und erspare mir einen weiteren Aufruf von foreach. Zu guter Letzt sei noch erwähnt, wann immer ich eine API entwickle, die auf Futures basiert, ich beispielsweise aber noch keine Implementierung habe, kann ich auch dann die Werte einfügen, die trotzdem Futures sind. Zum Beispiel funktioniert das relativ einfach mit dem Aufruf von Future. Successful und dann beispielsweise einem String. Damit erzeuge ich also ein Future das für alle Folgeaufrufe genauso genutzt werden müsste, wie ein API Aufruf. Ich habe Ihnen also hilfreiche Methoden für Futures gezeigt. Das sind Methoden, mit denen Sie Futures erzeugen können. Eine davon ist Future.Sequence. Damit können Sie also nun multiple Futures auf einmal behandeln und auf deren Ausgang warten. Aber beachten Sie, dass hier die Fehlerbehandlung bereits auf den Futures stattfinden muss. Eine weitere sehr interessante Funktion ist Future.Sucessful. Es erzeugt also ein Future, basierend auf einem Wert, der bereits existiert. So kann ich also eine API basierend auf Futures entwerfen, muss allerdings aktuell noch keine Implementierung vornehmen. Ausserdem gibt es hilfreiche Methoden auch auf Futures selbst. Zum einen kann man also ganz einfach Zwischenwerte verändern mit Hilfe der Map-Methode. Wenn man ein Future abschließt, sollte man vor allem mit einem Uncompletion Händler arbeiten und dabei auf Success und Failure prüfen, so dass man zum einen Fehler auswertet und zum anderen dann die korrekten Werte weiterverwenden kann. Sollte man einen solchen Uncompletion Händler nicht verwenden, beispielsweise auch keine Recovery-Methode haben, so kann es sein, dass man Fehler effektiv nicht sehen kann. Denn lalle Fehler, die innerhalb eines Futures auftreten, werden nicht auf die Konsole ausgegeben. Da sie nicht auf dem Standard-Thread laufen. Eine weitere sehr hilfreiche Methode ist die Nutzung von Flatmap. Damit kann ich also von einem Future auf ein weiteres Future Mappen und bekomme trotzdem in Folge dieser Kette eine korrekte Antwort, die nicht wiederum ein Future ist. Sondern ich kann dann ganz normal mit dem Ausgabewert arbeiten.

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!