2013-02-16 51 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

相关问题