我已经相当熟悉其他语言(主要是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,从而创建它的引用,就像封闭一样。但是我没有看到它,似乎其他人也没有,所以也许这只是一个死胡同的问题。
答案 0 :(得分:2)
您无法取消填充Promise
或Future
。您可能正在寻找来自Scala.rx或RxScala的Observable
,Rx
,Var
,...等内容。