scala - tutorial - future traverse
Diferencia Await.ready y Await.result (2)
Sé que esta es una pregunta bastante abierta y me disculpo.
Puedo ver que Await.ready
devuelve Awaitable.type
mientras que Await.result
devuelve T
pero todavía las confundo.
¿Cuál es la diferencia entre los dos?
¿Está uno bloqueando y el otro no bloqueando?
Ambos bloquean hasta que el futuro se complete, la diferencia es solo su tipo de retorno.
La diferencia es útil cuando su Future
arroja excepciones:
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
En general, ambos están bloqueando.
La diferencia es que Await.ready
está bloqueando hasta que el futuro haya finalizado (sea exitoso o haya fallado) en un momento dado.
La única diferencia es que los bloques ready
hasta que el Awaitable
esté listo y el result
produzca el tipo de resultado T
Postscriptum: En la práctica, si desea realizar algunas acciones como la comprobación o el registro de errores, debería tomar Await.ready(...)
si desea componer el resultado y arrojar un error si algo sale mal, tome Await.result(...)
.
Como regla de oro, trata de evitar la espera.