初始化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”的情况下做到这一点。 这感觉就像是“应该”成为一个能够让我创造新的承诺,并因此引用它,以某种封闭的方式创建的构造。 但我没有看到它,而且看起来其他人也不是,所以也许这只是一个死胡同的问题。
你不能完成一个Promise
或Future
。 您可能正在寻找来自Scala.rx或RxScala的Observable
, Rx
, Var
等...。