2015-04-02 58 views
2

在scala中,Futures有一種需要部分函數的救援功能。如果Future使用響應解析,則會跳過此代碼,但如果發生故障則會調用該代碼。在scala中如何包裝PartialFunction?

我想簡單地將部分函數包裝在代理中,該代理始終執行寫入stat計數器的代碼。起初我以爲我只是創建另一個PartialFunction,但很快意識到,它不適用於isDefined,然後申請,因爲我真的希望每次都調用它。

我該如何去代理PartialFunction,以便在Future有異常時總是調用我的代碼?

+0

你想你的函數執行所有的失敗,或者無論什麼? – 2015-04-02 17:35:24

+0

僅適用於所有故障。 – 2015-04-02 17:41:44

+0

爲什麼不使用'onFailure'回調呢? – 2015-04-02 17:46:49

回答

5

總結評論:當Future出現故障時,您可以使用onFailure回調執行一些副作用代碼(日誌記錄)。

val future = Future(1/0) 

future.onFailure { 
    case _ => println("I have seen the Future, and it doesn't look good.") 
} 

由於@cmbaxter筆記,你也可以在Future,它接受一個PartialFunction[Try[A], B]並返回Future使用andThen。因此,您可以使用andThen以及之後的recover來應用副作用功能。你甚至可以連鎖多次。

Future(1/0) 
    .andThen { case Failure(_) => println("Future failed.") } 
    .recover { case e: ArithmeticException => 0 } 
    .andThen { case Failure(_) => println("Tried to recover, and still failed.") } 

或輔助,它總是包括它:

object FutureLogger { 
    def apply[A](a: => A): Future[A] = Future(a).andThen { 
     case Failure(_) => println("FAILURE") 
    } 
} 
相關問題