我知道这是一个相当开放的问题,我很抱歉。区别Await.ready和Await.result
我可以看到Await.ready
返回Awaitable.type
而Await.result
返回T
但我仍然混淆他们。
两者有什么区别?
是一个阻塞和另一个非阻塞?
我知道这是一个相当开放的问题,我很抱歉。区别Await.ready和Await.result
我可以看到Await.ready
返回Awaitable.type
而Await.result
返回T
但我仍然混淆他们。
两者有什么区别?
是一个阻塞和另一个非阻塞?
它们都会阻塞,直到将来完成,差异只是它们的返回类型。
的区别是有用的,当你的Future
抛出异常:
def a = Future { Thread.sleep(2000); 100 }
def b = Future { Thread.sleep(2000); throw new NullPointerException }
Await.ready(a, Duration.Inf) // Success(100)
Await.ready(b, Duration.Inf) // Failure(java.lang.NullPointerException)
Await.result(a, Duration.Inf) // 100
Await.result(b, Duration.Inf) // crash with java.lang.NullPointerException
一般来说,两者都是阻塞的。
区别在于Await.ready
在给定时间内未完成(成功或失败)之前阻塞。
唯一一个区别是,ready
块直到Awaitable
就绪且result
确实产生的结果类型T
。
Postscriptum: 在实践中,如果要执行类似错误检查一些动作或登录你会采取Await.ready(...)
如果你想撰写的结果,并抛出一个错误,如果出现错误采取Await.result(...)
。
作为经验法则 - 尽量避免等待。