我正在使用第三方代码中的函数,如下所示:
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?
| })
| }
我该怎么做才能让它发挥作用?
感谢。
答案 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
}