从侦听器获取异步结果

时间:2015-01-22 09:42:45

标签: scala concurrency locks

Imagaine我有以下代码:

class Listener {

  //excuted by thread 1
  //called when request is finshed
  def complete(result: Result) = //get result as return value for request

}


//excuted by thread 2
def request: Result = {
  //Do something that invokes Listener.complete
  //return result from listener
}

正如我已经在评论中写的那样,我希望得到我的Listener.complete函数的结果作为我的请求函数的结果。我可以通过将一个锁与一个var组合来存档,但这不是一个好的scala风格。那么什么是alernatives?

1 个答案:

答案 0 :(得分:1)

def request: Future[Result] = {
  val p = promise[Result]

  new Listener {
    def complete(result: Result) = p.success(result)
  }

  p.future
}

现在你有一个Future[Result],你可以传回给你的来电者。如果你有一个异步函数(你这样做),你不应该试图隐藏这个事实。相反,使用未来并让您的来电者使用mapflatMaponSuccess等。