重新初始化承诺(Scala)

时间:2018-01-07 17:10:19

标签: scala functional-programming promise

我已经相当熟悉其他语言(主要是Java和JavaScript)的一般概念已经有一段时间了(我猜想可能是错误的),但是当我在Scala中修改Promise API时,我就把我撞了我还没有设法解决“风格”问题(没有双关语!),公平地说,我不知道我是否“应该”解决它。

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

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”的概念(承诺管道是一个类似monadic的东西,而flatmap和变体是高阶函数)。但我不能为我的生活(如果你告诉我这是多么简单,我很可能会很好地自我踢)看看如何在没有创建新的情况下获得“重置”的承诺,如果我必须创建一个新的,我不知道如何在不使用可变变量的情况下与它进行交互。

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

编辑:

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

1 个答案:

答案 0 :(得分:2)

您无法取消填充PromiseFuture。您可能正在寻找来自Scala.rx或RxScala的ObservableRxVar,...等内容。