我正在尝试为我的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]
的成员
答案 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
}