0

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

这是我的代码的大纲。我的意图是返回一个 Promise[String] 并在我的操作中完成它。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 {} 块中出现编译错误:

值映射不是 scala.concurrent.Promise[String] 的成员

4

1 回答 1

1

事实证明,Play 从根本上改变了 Play 2.0 和 2.1 版本之间的异步工作方式。

通过谷歌搜索“Play Async”,您首先获得了 2.0 版的文档,这就是我上面的代码不起作用的原因。这是文档的过时版本!

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

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

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

  resultPromise.future
}
于 2013-07-19T07:24:33.073 回答