【问题标题】:Completing a Promise[T] with Async in Scala and Play2在 Scala 和 Play2 中使用异步完成 Promise[T]
【发布时间】:2013-07-18 09:07:34
【问题描述】:

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

【问题讨论】:

    标签: scala concurrency playframework-2.0 future promise


    【解决方案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
    }
    

    【讨论】:

    • 这个改变的原因是现在使用了 Scala 2.10,它有一个 Future/Promise API 作为标准库的一部分。 Play 现在使用它而不是它自己的实现。
    • 不确定这是否相关,但我运行的是 Scala 2.9.1,因为它仅在 Ubuntu 12.04 上可用。
    • Play 包含它自己捆绑使用的 scala 版本,因此您实际上甚至不必安装 Scala 就可以编写 play/scala 代码。
    • 是的 - 我注意到在我写了评论之后 :) “play console”显示我实际使用的 Play 的 Scala 版本是 2.10。
    • 如何处理models.item.getJson未来块中抛出的错误
    猜你喜欢
    • 1970-01-01
    • 2019-08-20
    • 2017-09-30
    • 1970-01-01
    • 2013-03-28
    • 1970-01-01
    • 2020-08-13
    相关资源
    最近更新 更多