2014-10-30 166 views
1

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

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

在第一个答案中描述的方式让我看到了这段代码。不幸的是我不知道如何正确定义这个F.Function。代码不能编译。

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

回答

3

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

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

这将是一件好事,如果你可以进入一个这里再详细一点,解释你做了什么。 – blalasaadri 2014-10-31 09:30:45

+1

增加了一些更多的解释。 :) – MeiSign 2014-10-31 09:51:52

1

好吧,由于该生态系统中没有对承诺或期货的“标准”,因此您必须手动完成。在游戏承诺和scala期货之间没有“同化”的概念。

基本上,我们把F.Promise当成我们要处理的回调,我们通过创建一个Promise(它在Scala中令人困惑的意思是“创造Future的那个”)将它转换为scala Future。这里是如何工作的,而不是代码的描述,因为我认为这将更好地解释了理由:

  • 创建一个新的Promise[T] - 在F.Promise你,在F.Function传递给它p
  • 呼叫.map ,请拨打p success与承诺的价值 - 有效地解决承诺。
  • 同样 - 在承诺和呼叫p failure内呼吁.recover与失败的原因。
  • 返回p.future,这是一个未来代表价值p解决 - 因为我们镜像成功和失败渠道,这将工作。

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

+0

Iam不知道我是否可以完全跟随你,但我会尝试将它放入代码。感谢您的快速回答 – MeiSign 2014-10-30 10:30:21

+1

@MeiSign我的目标是让您了解我们正在做什么以及为什么 - 我正在试验回答解决方案的步骤而不是解决方案本身,因为我认为它可能更具生产力 - 如果你卡住让我知道,我会尽力澄清。 – 2014-10-30 10:32:45

+0

我想我理解你的想法,但我正在努力将F.Function传递给java map函数。你能帮我解决这个问题吗?这是我到目前为止:http://www.gist.github.com/MeiSign/ef70b73ae8433a8c53cd – MeiSign 2014-10-30 13:02:13