【发布时间】: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