4

For the following snippet IDEA gives a warning, that future {None} would be redundant:

queryString match {
  case Some(query) => ... // Do async call
  case None        => future { None }
}

Is there a better possibility to do it?

4

3 回答 3

5

你可以创建一个已经设定的未来而不产生闭包,使用Future.successful[T](result: T),所以也许Future.successful(None)是你想要的。

但是,由于期货已经独立于其类型参数区分成功和失败,因此您也可以通过 表示失败Future.failed(new Exception("No query string")),因为您的异步调用也可以省略包装 in Some

于 2013-02-16T17:26:04.917 回答
1

我不知道 IDEA 的警告在这种情况下是否有帮助。

您可以通过将匹配推到未来来使其静音:

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

(或更简单地说future { queryString.map(computeResult(_)) }:)

于 2013-02-16T17:20:37.253 回答
1

我想我自己解决了这个问题:我不需要封装在我的 Future 中的 Option,因为 Future 本身也可能失败,因此失败有点等于 None。

现在我只返回一个 Future 并且:

queryString match {

  case Some(query) =>
    //async Call which returns a Future without Option
  case None => throw new Exception("Error")
}
于 2013-02-16T17:25:11.163 回答