2017-03-14 108 views
1

我想實現期貨的重試機制。如何使用Scala隱式類的類型參數?

例如:

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)) 

所以未來應該一定的時間間隔後重試。

我的實現如下所示:

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)) } 
    } 

    } 

} 

不幸的是,類型參數T不能在隱式類聲明解決。任何想法有什麼不對?

回答

3

這裏沒有什麼特殊的隱式類。您已經在重試方法中指定了類型參數T,但在此之前引用了它(在類參數中)。將類型參數移動到類本身(FutureUtils[T](f: ...))。