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.