我目前正在构建一个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。
答案 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
- 有效解决承诺。.recover
并在处理程序调用{{1}}内调用失败原因。p failure
,这是一个代表值p.future
的未来得到解决 - 因为我们镜像了成功和失败渠道,这将有效。这与将其他任何东西转换为scala Future的方式没有什么不同。在另一个方向转换的工作方式类似。