Futures - carte vs flatmap

J'ai lu les docs sur map et flatMap et je comprends que flatMap est utilisé pour une opération qui accepte un Future paramètre et renvoie une autre Future. Ce que je n'ai pas entièrement comprendre, c'est pourquoi je veux le faire. Prenez cet exemple:

  1. Utilisateur accède à mon webservice demandant de "faire des trucs"
  2. - Je télécharger un fichier (qui est lent)
  3. - Je traiter le fichier (qui est consommateur d'UC)
  4. Rendre le résultat

Je comprends que j'ai envie d'utiliser un avenir pour télécharger le fichier, mais j'ai deux options re de traitement:

val downloadFuture = Future { downloadFile }
val processFuture = downloadFuture map { processFile }
processFuture onSuccess { case r => renderResult(r) }

ou

val downloadFuture = Future { //download the file }
val processFuture = downloadFuture flatMap { Future { processFile } }
processFuture onSuccess { case r => renderResult(r) }

En ajoutant des instructions de débogage (Thread.currentThread().getId) je vois que dans les deux cas de téléchargement, process et render se produire dans le même thread (à l'aide de ExecutionContext.Implicits.global).

Aurais-je utiliser flatMap simplement à découpler downloadFile et processFile et de s'assurer que processFile s'exécute toujours dans un Future même si elle n'a pas été cartographiés à partir de downloadFile?

source d'informationauteur