【问题标题】:Convert Play Framework java Promise to Play Framework Scala Promise将 Play Framework java Promise 转换为 Play Framework Scala Promise
【发布时间】:2014-12-26 07:28:33
【问题描述】:

我目前正在构建一个 Scala 播放框架应用程序,该应用程序使用一个以 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 回来。

【问题讨论】:

    标签: java scala playframework promise


    【解决方案1】:

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

    基本上,我们对待 F.Promise 就像对待回调一样,我们通过创建 Promise 将其转换为 scala Future(在 scala 中混淆的意思是“创建 Future 的东西”)。以下是对其工作原理的描述,而不是代码,因为我认为这样可以更好地解释基本原理:

    • 创建一个新的Promise[T] - p
    • 在F.Promise 上调用.map,在传递给它的F.Function 中,使用promise 的值调用p success - 有效地解决promise。
    • 类似地 - 在 Promise 上调用 .recover 并在其处理程序中调用 p failure 失败原因。
    • 返回 p.future,这是一个代表 p 解析值的未来 - 因为我们镜像了成功和失败通道,这将起作用。

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

    【讨论】:

    • 我不确定我是否可以完全关注您,但我会尝试将其放入代码中。感谢您的快速回答
    • @MeiSign 我的目标是让您了解我们在做什么以及为什么 - 我正在尝试回答解决方案的步骤而不是解决方案本身,因为我认为它可能更有效率- 如果您遇到困难,请告诉我,我会尽力澄清。
    • 我想我理解你的想法,但我正在努力将 F.Function 传递给 java map 函数。你能帮我做那部分吗?这是我到目前为止所拥有的:gist.github.com/MeiSign/ef70b73ae8433a8c53cd
    • 推送,因为我认为由于我删除了第一条评论,您没有收到评论通知
    【解决方案2】:

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

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

    【讨论】:

    • 如果你能在这里更详细一点,解释你做了什么,那就太好了。
    • 添加了更多解释。 :)
    猜你喜欢
    • 2016-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多