如何从调用者返回回调参数值?

时间:2013-02-15 05:37:21

标签: scala

我正在使用第三方代码中的函数,如下所示:

scala> def willCallback(fun: Function1[Int, Unit]) {
     | doWork()
     | fun(1)
     | }
willCallback: (fun: Int => Unit)Unit

在我的代码中,我定义了一个函数,并希望它返回回调函数参数,以实现这个目的:

scala> def callbackResult():Int = {
     |   willCallback( (i:Int) => {
     |     // What do I put here 
     |     // to make the return value of callbackResult to be i?
     |   })
     | }

我该怎么做才能让它发挥作用?

感谢。

4 个答案:

答案 0 :(得分:4)

从您的评论中看起来您希望阻止willCallback直到回调执行完毕。以下是使用Future/Promise API in Scala 2.10

执行此操作的方法
import scala.concurrent._

// Library code (which you can't modify)
def willCallback(fun: Int => Unit) { fun(1) }

// Your code. You can fulfill a `promise` in your callback
def callbackResult(): Int = {
  val p = promise[Int]
  val f = p.future

  willCallback { i: Int =>
    p.success(i)
  }

  // Block until the promise has been fulfilled (the callback has executed).
  // In this case, the return value is 1
  Await.result(f, duration.Duration.Inf)
}

当然,存在这样的危险:如果回调从未执行,则callbackResult()方法将无限期挂起。为了避免这种危险,callbackResult()可能更好地返回f: Future[Int]而不是等待其Int值,正如RégisJean-Gilles建议的那样。

答案 1 :(得分:1)

目前还不清楚你想要什么或期望什么,但return对新手来说既困惑又很少。

尝试将“回调”表达为表达式或表达式序列。最后一个表达式是你想要“返回”的值。

你需要知道的是return从顶级方法返回,而不是函数或内部方法。

答案 2 :(得分:1)

这是你的意思吗?

def callbackResult(result:Int) = {
   // code
}

willCallback(callbackResult)

另一个版本是:

willCallback( { result =>
   // code
})

答案 3 :(得分:1)

目前还不清楚你想要实现的目标,但这是另一个镜头:

def callbackResult():Int = {
  var result = 0
  willCallback( (i:Int) => {
    result = i
    // rest of your code
  })
  result
}