将Play Framework java Promise转换为Play Framework Scala Promise

时间:2014-10-30 09:57:27

标签: java scala playframework promise

我目前正在构建一个Scala play框架应用程序,该应用程序使用一个以F.Promise(Java Promise)形式返回结果的库。有没有办法将F.Promises(https://www.playframework.com/documentation/2.1.0/api/java/play/libs/F.Promise.html)转换为Scala Promises或将包装的Scala Future从F.Promise中取出?

到目前为止,我看到的唯一方法是获取F.Promise,但这是一个阻塞操作,我想继续异步工作。

第一个答案中描述的方式使我得到了这个代码。不幸的是我不知道如何正确定义这个F.Function。代码无法编译。

答案: 所以,我终于发现F.Promise有一个名为wrapped()的方法。这个方法可以为你提供Scala Future。

2 个答案:

答案 0 :(得分:3)

事实证明,类F.Promise(java.play)有一个名为wrapped()的方法,它返回由Promise包装的scala.concurrente.Future。所以你要做的就是把它包裹在F.Promise上。

val promise: F.Promise[T] = getPromise()
val future : Future[T] = promise.wrapped()

答案 1 :(得分:1)

那么,由于该生态系统中的承诺或期货没有“标准”,您必须手动完成。游戏承诺和斯卡拉期货之间没有“同化”的概念。

基本上,我们将F.Promise视为我们对待回调,我们通过创建Promise将其转换为scala Future(在scala中令人困惑的意思是“创建Future的那个”)。以下是对其工作原理的描述,而不是代码,因为我认为这可以更好地解释理由:

  • 制作新的Promise[T] - p
  • .map上呼叫F.Promise,在传递给它的F.Function中,使用承诺的价值致电p success - 有效解决承诺。
  • 同样 - 在promise上调用.recover并在处理程序调用{​​{1}}内调用失败原因。
  • 返回p failure,这是一个代表值p.future的未来得到解决 - 因为我们镜像了成功和失败渠道,这将有效。

这与将其他任何东西转换为scala Future的方式没有什么不同。在另一个方向转换的工作方式类似。