2017-03-14 5 views
1

Ich möchte einen Wiederholungsmechanismus für Futures implementieren.Wie Typ Parameter für Scala implizite Klasse verwenden?

Zum Beispiel:

myFuture.map { data => 
    println(data) 
    // ... do other stuff 
}.recover { 
    case e: MyException => logger.error("Something went wrong with XYZ", e) 
    case _ => logger.error("Error!") 
}.retry(Seq(1.seconds, 10.seconds, 30.seconds)) 

So ist die Zukunft sollte nach bestimmten Intervallen wiederholt werden.

Meine Implementierung sieht wie folgt aus:

import akka.pattern.after 
import akka.actor.Scheduler 
import scala.concurrent.{ExecutionContext, Future} 
import scala.concurrent.duration.FiniteDuration 

object FutureExt { 

    implicit class FutureUtils(f: Future[T]) { 

    def retry[T](delays: Seq[FiniteDuration])(implicit ec: ExecutionContext, s: Scheduler): Future[T] = { 
     f recoverWith { case _ if delays.nonEmpty => after(delays.head, s)(f.retry(delays.tail)) } 
    } 

    } 

} 

Leider ist der Typ-Parameter T kann nicht in der impliziten Klassendeklaration aufgelöst werden. Irgendeine Idee, was ist daran falsch?

Antwort

3

Nichts Besonderes für implizite Klassen hier. Sie haben den Typparameter T für die Wiederholungsmethode angegeben, aber früher darauf verwiesen (in den Klassenparametern). Verschieben Sie den Typ param in die Klasse selbst (FutureUtils[T](f: ...)).