Je sais que c'est une question assez ouverte et je m'en excuse.
Je peux voir ça Await.ready
résultats Awaitable.type
tandis que Await.result
renvoie T
mais je les confond toujours.
Quelle est la différence entre les deux?
L'un est-il bloquant et l'autre non-bloquant?
Ils bloquent tous les deux jusqu'à ce que l'avenir se termine, la différence est juste leur type de retour.
La différence est utile lorsque votre Future
lève des exceptions:
def a = Future { Thread.sleep(2000); 100 }
def b = Future { Thread.sleep(2000); throw new NullPointerException }
Await.ready(a, Duration.Inf) // Success(100)
Await.ready(b, Duration.Inf) // Failure(Java.lang.NullPointerException)
Await.result(a, Duration.Inf) // 100
Await.result(b, Duration.Inf) // crash with Java.lang.NullPointerException
Les deux bloquent au plus le Duration
donné. Toutefois, Await.result
essaie de renvoyer le résultat futur immédiatement et lève une exception si le futur a échoué pendant que Await.ready
renvoie le futur terminé à partir duquel le résultat (Success
ou Failure
) peut être extrait en toute sécurité via la propriété value
.
Ce dernier est très pratique lorsque vous devez également gérer un délai d'attente:
val future = Future { Thread.sleep(Random.nextInt(2000)); 123 }
Try(Await.ready(future, 1.second)) match {
case Success(f) => f.value.get match {
case Success(res) => // handle future success
case Failure(e) => // handle future failure
}
case Failure(_) => // handle timeout
}
Lors de l'utilisation de Await.result
, l'exception de délai d'expiration et les exceptions de contrats à terme défaillants sont "mélangées".
Try(Await.result(future, 1.second)) match {
case Success(res) => // we can deal with the result directly
case Failure(e) => // but we might have to figure out if a timeout happened
}
En général, les deux bloquent.
La différence est que Await.ready
Bloque jusqu'à ce que le futur soit terminé (réussi ou échoué) dans le temps imparti.
La seule différence est que ready
bloque jusqu'à ce que Awaitable
soit prêt et que result
donne le type de résultat T
.
Postscriptum: Dans la pratique, si vous souhaitez effectuer certaines actions comme la vérification des erreurs ou la journalisation, vous devez prendre Await.ready(...)
si vous voulez composer le résultat et lancer une erreur si quelque chose ne va pas. Await.result(...)
.
En règle générale, essayez d'éviter l'attente.