Я прочитал документы о map
и flatMap
, и я понимаю, что flatMap
используется для операции, которая принимает параметр Future
и возвращает другой Future
. Я не совсем понимаю, почему я хотел бы это сделать. Возьмите этот пример:
- Пользователь обращается к моему веб-сервису с просьбой "делать что-то"
- Я загружаю файл (который работает медленно)
- Я обрабатываю файл (который интенсивно работает с ЦП)
- Получить результат
Я понимаю, что хочу использовать будущее для загрузки файла, но у меня есть два варианта его обработки:
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
?