tutorial traverse scala future

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.