初始化Promise(Scala)

我一直对其他语言(主要是Java和JavaScript)的一般概念(主要是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的事物,平面图和变种是高阶函数)。 但我不能为了我的生活(如果你向我展示这真的很简单,我可能会很好地设置一个良好的自我踢球),看看如何获​​得承诺“重置”,而不创建一个新的,如果我不得不创建一个新的,我不能看到如何与它进行交互,而不使用可变变量。

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

编辑:

我意识到我在一开始就很难回答这个问题。 我不想“重新触发”最初的Promise,我想允许处理Promise的结论来配置/设置一个新的Promise。 这本身并不难,但我希望能找到一个结构,让我在不使用“var”的情况下做到这一点。 这感觉就像是“应该”成为一个能够让我创造新的承诺,并因此引用它,以某种封闭的方式创建的构造。 但我没有看到它,而且看起来其他人也不是,所以也许这只是一个死胡同的问题。


你不能完成一个PromiseFuture 。 您可能正在寻找来自Scala.rx或RxScala的ObservableRxVar等...。

链接地址: http://www.djcxy.com/p/55435.html

上一篇: initializing a Promise (Scala)

下一篇: Scala: Is Promise redundant?