Я читал документы о map
и flatMap
, и я понимаю, что flatMap
используется для операции, которая принимает параметр Future
и возвращает другой Future
. Я не совсем понимаю, почему я хотел бы это сделать. Возьмем такой пример:Futures - карта против flatmap
- Пользователь попадает мой веб-сервиса с просьбой «делать вещи»
- загрузить файл (который медленно)
- Я обработать файл (который является ресурсоемкие)
- Отрендерьте результат
Я понимаю, что я хотел бы использовать будущее, чтобы загрузить файл, но у меня есть два варианта повторного его обработки:
val downloadFuture = Future { downloadFile }
val processFuture = downloadFuture map { processFile }
processFuture onSuccess { case r => renderResult(r) }
или
val downloadFuture = Future { // download the file }
val processFuture = downloadFuture flatMap { Future { processFile } }
processFuture onSuccess { case r => renderResult(r) }
Добавляя отладочные операторы (Thread.currentThread().getId
) Я вижу, что в обоих случаях скачать, process
и render
происходит в том же потоке (с использованием ExecutionContext.Implicits.global
).
ли я использовать flatMap
просто разъединить downloadFile
и processFile
и убедитесь, что processFile
всегда работает в Future
, даже если он не был отображен с downloadFile
?
Спасибо за подтверждение этого peter –