2013-02-16 61 views

回答

5

您可以在不產卵封閉,使用Future.successful[T](result: T)創建已確定未來的,所以也許Future.successful(None)是你想要的。

由於期貨已經獨立於其類型參數區分成功和失敗,但是,由於您的異步調用也可以省略Some中的包裝,因此您也可以通過Future.failed(new Exception("No query string"))發信號通知失敗。

1

我不知道IDEA的警告是在這種情況下有幫助。

你可能通過推動匹配下到未來沉默吧:

future { 
    queryString match { 
     case Some(query) => Some(computeResult(query)) 
     case None => None 
    } 
} 

(或者更簡單地:future { queryString.map(computeResult(_)) }

1

我想我解決了這個問題由我自己:我不需要一個選項封裝在我的未來中,因爲未來本身也可能失敗,因此失敗類似於無。

現在我只返回一個未來:

queryString match { 

    case Some(query) => 
    //async Call which returns a Future without Option 
    case None => throw new Exception("Error") 
} 
+2

拋出異常是一個非常重量級的,而不是總是處理缺失值非常理想的手段。 – 2013-02-16 17:57:19

+0

但大多數教程中的期望似乎都是由Exceptions處理的。在這裏看到:http://docs.scala-lang.org/sips/pending/futures-promises.html#functional_composition_and_forcomprehensions – Tyde 2013-02-17 00:32:58

+1

一個'未來的[選項[T]]'可以返回'成功(無)'表示「沒事就去處理不當,但你想要的價值不在那裏「。 – 2013-02-17 14:25:52

相關問題