Ceci n'est pas encore une partie de l'API des Future
, mais pourrait être ajouté comme une extension à l'avenir.
En attendant, vous pourriez utiliser le firstCompletedOf
pour envelopper 2 futures - le future que vous souhaitez annuler et un future provenant d'une Promise
personnalisée. Vous pourriez ensuite annuler le future ainsi créé en échouant la promesse :
def cancellable[T](f: Future[T])(customCode: => Unit): (() => Unit, Future[T]) = {
val p = Promise[T]
val first = Future firstCompletedOf Seq(p.future, f)
val cancellation: () => Unit = {
() =>
first onFailure { case e => customCode}
p failure new Exception
}
(cancellation, first)
}
Maintenant, vous pouvez appeler ceci sur n'importe quel future pour obtenir un "wrapper annulable". Exemple d'utilisation :
val f = callReturningAFuture()
val (cancel, f1) = cancellable(f) {
cancelTheCallReturningAFuture()
}
// quelque part ailleurs dans le code
if (condition) cancel() else println(Await.result(f1))
EDIT :
Pour une discussion détaillée sur l'annulation, consultez le Chapitre 4 dans le livre Learning concurrent programming in Scala.