Je veux adapter ce example:Scala avenir n'est pas correctement appelé lors de l'utilisation de classe implicite
def retry[T](f: => Future[T], delays: Seq[FiniteDuration])(implicit ec: ExecutionContext, s: Scheduler): Future[T] = {
f recoverWith { case _ if delays.nonEmpty => after(delays.head, s)(retry(f, delays.tail) }
}
Pour soutenir les appels comme: myFuture.retry(Seq(1.seconds, 5.seconds, 10.seconds)).map {data => process(data)}
.
Voilà comment j'implémenté:
import akka.pattern.after
import akka.actor.Scheduler
import scala.concurrent.{ExecutionContext, Future}
import scala.concurrent.duration.FiniteDuration
object FutureExtension {
implicit class FutureExtension[T](f: Future[T]) {
def retry(delays: Seq[FiniteDuration])(implicit ec: ExecutionContext, s: Scheduler): Future[T] = {
f recoverWith { case _ if delays.nonEmpty => after(delays.head, s)(f.retry(delays.tail)) }
}
}
}
je remarquai que la méthode est appelée retry
correctement, mais pas l'évaluation de l'avenir d'origine. Lors du débogage, j'ai remarqué que la valeur du futur est Failure
et je suppose que c'est une indication que je ne récupérerai jamais correctement, ce qui signifie que je n'appellerai jamais le futur original.
Comment puis-je résoudre ce problème?