2015-03-13 60 views
3

我有一個Scala未來,如果結果不正確,則調用api並返回未來,然後另一個api調用將與第一個未來結果一起提交,並作爲未來返回。基於第一個未來結果的Scala未來回報

這是我到目前爲止。

val fut1 = Future(queryFirst) 
val fut2 = fut1 map { 
    case y if y.isInstanceOf[NoResult] => Future(queryAgainWithFut1Result) 
    case x => x 
} 

但是,如果我訪問FUT2結果,它給了這樣的事情:

scala.concurrent.Await.result(fut2, 5 seconds) 
warning: there was one feature warning; re-run with -feature for details 
fut2: Any = [email protected] 

有沒有辦法,我可以選擇退貨FUT2如果FUT1結果是不準確的方法嗎?

編輯: 第二個未來必須使用第一個未來來繼續api調用。這是我迄今爲止所擁有的。

val fut1 = Future("queryFirst") 
val fut2 = fut1 flatMap { 
    case y if y.isInstanceOf[Int] => Future("queryAgainWithResult(y)") 
    case x => Future(x) 
} 
+0

你知道'recoverWith'嗎? – 2015-03-13 18:12:36

回答

8

可以filter第一Future以使其當其所含的結果不匹配,你想要什麼,然後用recoverWith回收有價值另一個Future失敗。

Future(queryFirst) 
    .filter(result => /* logic that returns true if result is correct */) 
    .recoverWith { case NonFatal(e) => Future(querySecond) } 

如果queryFirst是成功的,並使其通過filter,那麼它的結果將返回(包裹在Future)。

如果queryFirst是成功的,並根據filter只是失敗,那麼Future(querySecond)結果將被退回,成功或失敗,沒有一個正確的值。


編輯:在從OP的新的信息,如果你需要不正確的第一Future的結果,那麼你真的沒有選擇,只能使用flatMap

Future(queryFirst).flatMap { 
    case result if(/* failed condition */) => Future(querySecond(result)) 
    case result => Future.successful(result) 
} 
+0

刪除我的好回答 – 2015-03-13 18:21:43

+0

實際上,第二個未來必須使用第一個未來的結果繼續api調用。除非我可以訪問第一個未來的結果,否則你的方法將無法工作。 – angelokh 2015-03-13 18:31:55

+0

@angelokh你應該真的提到這樣的重要信息,第一.. – 2015-03-13 18:33:04