【问题标题】:How to add callbacks to Future in Scala?如何在 Scala 中向 Future 添加回调?
【发布时间】:2013-05-14 17:37:03
【问题描述】:

我看到了一个例子here

val fut = Future { ... // 我的身体功能 } // 我的身体功能从这里开始 fut onComplete { ... // 我的回调 }

看起来我可以在我的主体函数完成之后添加回调。它仍然被调用吗?无论如何,我宁愿在我的函数开始运行之前向未来添加回调。是否有意义 ?我该怎么做?

【问题讨论】:

    标签: scala concurrency future


    【解决方案1】:

    文档非常清楚您的第一点:

    如果未来注册时已经完成 回调,则回调可以异步执行,或者 在同一个线程上按顺序。

    至于您的后一个问题-您可以将需要运行的代码作为未来正文的第一行,例如:

    def futureWithBefore[T](body: => T, before: => Any) = future {
      before()
      body()
    } 
    

    【讨论】:

    • 我认为 OP 希望确保回调注册发生在未来执行之前,而不是在未来主体之前执行代码
    【解决方案2】:

    如果你想控制未来的执行点,你可以用Promise链接它。

    import scala.concurrent._
    import ExecutionContext.Implicits.global
    
    val initialPromise = promise[Unit]
    
    // add your computations
    val fut = initialPromise.future map { _ => println("My Future") }
    
    // register callbacks
    fut onComplete { _ => println("My Callback") }
    
    // run
    initialPromise.success()
    

    使用 Unit 以外的其他东西可以让您为计算提供任意值。

    【讨论】:

    • 这是正确的,但我认为与 om-nom-nom 的更简单方法相比没有任何优势。我错过了什么吗?
    • 这样组成,future 和 callback 可以在不同的 executor 上运行。 Promise 需要更多的新闻报道。 (我完全错过了 OP 的问题。)
    【解决方案3】:

    或者类似的东西:

    $ skala
    Welcome to Scala version 2.11.0-20130423-194141-5ec9dbd6a9 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_06).
    Type in expressions to have them evaluated.
    Type :help for more information.
    
    scala> :pa
    // Entering paste mode (ctrl-D to finish)
    
    import scala.concurrent._
    import ExecutionContext.Implicits.global
    
    // Exiting paste mode, now interpreting.
    
    import scala.concurrent._
    import ExecutionContext.Implicits.global
    
    scala> val x = Future { Thread sleep 60000L ; 7 }
    x: scala.concurrent.Future[Int] = scala.concurrent.impl.Promise$DefaultPromise@44b0c913
    
    scala> def todo = println("Extra work before the job.")
    todo: Unit
    
    scala> def something(i: Int) = { todo ; i }
    something: (i: Int)Int
    
    scala> x map something
    res0: scala.concurrent.Future[Int] = scala.concurrent.impl.Promise$DefaultPromise@2a5457ea
    
    scala> def f(i: Int) = { println(s"Job $i"); i+1 }
    f: (i: Int)Int
    
    scala> .map (f)
    res1: scala.concurrent.Future[Int] = scala.concurrent.impl.Promise$DefaultPromise@32bc46f4
    
    scala> .value
    res2: Option[scala.util.Try[Int]] = None
    
    scala> Await result (res1, duration.Duration("60 seconds"))
    Extra work before the job.
    Job 7
    res3: Int = 8
    

    是的,我需要一点时间来输入。

    【讨论】:

      猜你喜欢
      • 2015-10-10
      • 2015-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-07
      • 1970-01-01
      • 2015-11-26
      • 1970-01-01
      相关资源
      最近更新 更多