我有一个回调处理程序,它处理URL处理的许多阶段之一。在这个处理程序中,我必须使用第三方库(scala接口)并计算一些值,这将设置一个全局配置。此配置由以下阶段使用,它在回调处理程序中获得的值起着至关重要的作用。
以下是设计的外观
def callbackHandler() : someReturnType = {
val myFut = getMyData() // return a future
myFut map {m => set_global} // evaluate the future
someReturnTypeObject
}
有了这个背景,这是我的问题。我正在使用的Scala API向我返回一个未来,我使用" map"来评估它。正如我在获得未来实例后所理解的那样,回调函数将继续使用待处理的东西,并且将在可用时评估将来(在单独的线程中)。
在这种情况下,我将如何确保让回调处理程序等待将来的评估?
将第4行移动到地图主体可能无法正常工作,因为如果地图占用时间,callbackhandler可能仍会提前返回。如果您有疑问,请告诉我,或者如果我的理解错误,请告诉我。
答案 0 :(得分:1)
使用Future
的目的是不阻止线程。理想情况下,您应该在未来完成时执行您想要的代码,而不是阻止未来并在同一个线程上继续。
也就是说,阻止未来的机制是:
val result = Await.result(myFut, 10.seconds)
其中10.seconds
是您愿意等待的最长时间。
您还应注意map
未评估未来。一旦拨打getMyData
,评估就会开始。一旦结果可用,map
所做的就是将未来的结果转化为未来。