【问题标题】:Re-initializing a Promise (Scala)重新初始化一个 Promise (Scala)
【发布时间】:2018-06-16 19:10:45
【问题描述】:

我对来自其他语言(主要是 Java 和 JavaScript)的 Promise 的一般概念已经有一段时间了(我想可能是被误导了),但是当我在 Scala 中修改 Promise API 时,我敲了我的解决一个我还没有解决的“风格”问题(不是双关语!),公平地说,我不知道我是否“应该”解决它。

我担心的是使用 promise/future 来处理重复(例如类似事件)的情况。这是代码(抱歉,考虑到其中的一小部分很重要,但我不确定如何在没有具体示例的情况下清楚地讨论这个问题。

import javax.swing._
import scala.concurrent.Promise

object PromGui {
  def main(args: Array[String]): Unit = {
    import scala.concurrent.ExecutionContext.Implicits.global
    var promise = Promise[String] // VAR?? really?
    promise
      .future
      .map(s => s"The initial value is $s")
      .foreach(Console.err.println)

    val f = new JFrame("My Frame")
    val p = new JPanel()
    val t = new JTextField()
    val b = new JButton("Press me!")
    p.setLayout(new BoxLayout(p, BoxLayout.Y_AXIS))
    f.setContentPane(p)
    p add t
    p add b

    b.addActionListener( e => {
      promise.success(t.getText)
      promise = Promise[String] // var because this needs to update it
      promise.future
        .map(s => s"The subsequent value is $s")
        .foreach(Console.err.println)
    })

    f.setSize(400, 200)
    f.setVisible(true)
  }
}

现在,困扰我的是主方法内第二行的“var promise”。在我看来,Promises/Futures 是一种有点“FP”的概念(promise 管道是一个类似单子的东西,而平面图和变体是高阶函数)。但是我这辈子都做不到(如果你告诉我这真的很简单,我可能会很好地准备好自我踢球)看看如何在不创建新的情况下获得“重置”的承诺,如果我必须创建一个新的,如果不使用可变变量,我将看不到如何与之交互。

所以,我想真正的问题是,构造使用 promise/future 处理循环类型出现的代码的优雅方法是什么?

编辑:

我意识到我一开始就很糟糕地表达了这个问题。我不想“重新触发”原始 Promise,我想允许完成 Promise 的处理以配置/设置新的 Promise。这本身并不难,但我希望找到一种结构,让我在不使用“var”的情况下做到这一点。感觉“应该”有一个构造,可以让我创建新的 Promise,因此也可以像闭包一样创建对它的引用。但我没有看到它,似乎其他人也没有,所以也许这只是一个死胡同的问题。

【问题讨论】:

    标签: scala functional-programming promise


    【解决方案1】:

    您不能取消完成 PromiseFuture。您可能正在从 Scala.rx 或 RxScala 中寻找 ObservableRxVar 之类的东西。

    【讨论】:

    • 我可能会误解你,但我不想un完成它,我只想能够处理另一个按钮按下(或更一般地说,附加在“相同”触发条件下配置与原始管道相同的承诺管道)。我展示的代码完美运行,只是可变状态的使用感觉有点难看。尽管确实存在“更好的 API”,但这实际上是对 Promise/Future 的概念性调查,而不是解决问题的练习(当然,作为讨论的一部分,Rx 的事情很有价值 :)
    • 当然,如果您评论的本质是“Promise 不是为此而生的”,那肯定会有助于我理解这些概念。看起来很奇怪,这是“Scala 编程”(第三版)一书中的主要条目,如果它有那么有限的话。
    • 我想我误解了你。当您说重新初始化Promise 时,我认为这是重复使用相同的Promise。但无论具体细节如何,Promise API 并不适用于重复事件(尽管它们可以像您一样构建在它之上),而 Rx 是。
    • 是的,抱歉,术语的不确定性和混淆的可能性是我放入具体代码的重要部分,以试图超越它。 (尽管我也可能忽略了某种“重置”方法!)我想我有这种感觉,必须有某种方法可以在整个“从头开始”周围“包裹一个闭包” " 的东西,这样 var 可以用 val 替换。不过还没找到!
    • 我不排除存在 Promise 但没有 var 的解决方案的可能性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-29
    • 2011-05-11
    • 2010-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多