在Scala和Play2中使用Async完成Promise [T]

时间:2013-07-19 07:06:30

标签: scala concurrency playframework-2.0 future promise

我正在尝试为我的Action完成Promise [String]。到目前为止,我已经在http://www.playframework.com/documentation/2.0/ScalaAsync阅读了有关异步编程的Play文档,但是有些东西我没有得到 - 或者文档错了:)

这是我的代码大纲。我的目的是返回一个Promise [String]并在我的Action中完成。 Promise的内容可能来自不同的地方,所以我希望能够返回Promise [String]以使Action处理程序变得简单。

def getJson = Action { request =>
  val promiseOfJson = models.item.getJson
  Async {
    promiseOfJson.map(json => Ok(json))
  }   
}

def models.item.getJson: Promise[String] = {
  val resultPromise = promise[String]
  future {
     ...
     resultPromise success "Foo"
  }

  resultPromise
}

看看Play的文档和“AsyncResult”我觉得我在做同样的事情,不是吗?

问题是我在Async {}块中遇到了编译错误:

  

value map不是scala.concurrent.Promise [String]

的成员

1 个答案:

答案 0 :(得分:1)

原来,Play从根本上改变了Asyncs在Play版本2.0和2.1之间的工作方式。

通过谷歌搜索“播放异步”你首先得到版本2.0的文档,这就是为什么我的上述代码将无法正常工作。 这是文档的过时版本!

在Play 2.1(文档在这里:http://www.playframework.com/documentation/2.1.0/ScalaAsync)中,Async完成了Future [T]而不是Promise [T]。在Play 2.0 Async中完成了Promise [T],这就是我所拥有的(但我正在运行Play 2.1)。

我将代码更改为此代码并按预期工作:

def models.item.getJson: Future[String] = {
  val resultPromise = promise[String]
  future {
     ...
     resultPromise success "Foo"
  }

  resultPromise.future
}