Czytałem dokumenty dotyczące map
i flatMap
i rozumiem, że flatMap
służy do operacji, która przyjmuje parametr Future
i powraca kolejny Future
. Nie do końca rozumiem, dlaczego chciałbym to zrobić. Weźmy ten przykład:Futures - mapa vs flatmap
- użytkownika uderza mój usługa pytaniem „robić rzeczy”
- pobrać plik (który jest wolny)
- przetwarzać plik (który obciąża CPU)
- renderować wynik
rozumiem, że chciałbym skorzystać z przyszłości, aby pobrać plik, ale muszę mieć dwie możliwości ponownego przetworzenia go:
val downloadFuture = Future { downloadFile }
val processFuture = downloadFuture map { processFile }
processFuture onSuccess { case r => renderResult(r) }
lub
val downloadFuture = Future { // download the file }
val processFuture = downloadFuture flatMap { Future { processFile } }
processFuture onSuccess { case r => renderResult(r) }
Dodając oświadczenia debugowania (Thread.currentThread().getId
) Widzę, że w obu przypadkach pobranie, process
i render
występować w tym samym wątku (używając ExecutionContext.Implicits.global
).
użyłbym flatMap
prostu oddzielić downloadFile
i processFile
i upewnić się, że processFile
zawsze działa w Future
nawet jeśli nie został odwzorowany z downloadFile
?
Dzięki za potwierdzenie tego peter –