Ich habe die Dokumentation zu map
und flatMap
gelesen und ich verstehe, dass flatMap
für eine Operation verwendet wird, die einen Future
Parameter akzeptiert und gibt einen anderen Future
. Was ich nicht vollständig verstehe ist, warum ich das machen möchte. Nehmen Sie dieses Beispiel:Futures - Karte vs flatmap
- Benutzer meine WebService trifft fragen, "do stuff"
- ich eine Datei herunterladen (die langsam ist)
- ich die Datei bearbeiten
- Render (die CPU-intensiv ist) die Ergebnis
ich verstehe, dass ich eine Zukunft nutzen möchte, um die Datei herunterzuladen, aber ich habe zwei Möglichkeiten wieder verarbeitet es:
val downloadFuture = Future { downloadFile }
val processFuture = downloadFuture map { processFile }
processFuture onSuccess { case r => renderResult(r) }
oder
val downloadFuture = Future { // download the file }
val processFuture = downloadFuture flatMap { Future { processFile } }
processFuture onSuccess { case r => renderResult(r) }
von Debug-Anweisungen hinzugefügt (Thread.currentThread().getId
) Ich sehe, dass in beiden Fällen herunterladen, process
und render
im selben Thread auftreten (mit ExecutionContext.Implicits.global
).
Würde ich flatMap
einfach zu entkoppeln downloadFile
und processFile
und sicherzustellen, dass processFile
läuft immer in einem Future
auch wenn es nicht von downloadFile
abgebildet wurde?
Danke für die Bestätigung dieser Peter –