Intellij tiene una inspección (es decir, verificación de pelusa) que le indica que las funciones que devuelven Deferred deben llamarse algo que termine en Async .
Las convenciones de nomenclatura como estas tienen sentido para mí en lenguajes de escritura dinámica. Pero Kotlin tiene un buen corrector de tipos y un ecosistema de herramientas, entonces, ¿por qué confiar en la convención?
Especialmente porque las corrutinas de Kotlin incorporan la concurrencia estructurada , la función probablemente también tomará un parámetro CoroutineScope , que serviría la misma señal visual en el sitio de la llamada:
suspend fun doStuff() = coroutineScope { doStuffAsync(this /* CoroutineScope */).await() //... } Como nota al margen, entiendo el mensaje de la inspección de que rara vez querrá una función que devuelva una función Deferred en lugar de una función de suspend . Esa no es mi pregunta. Mi pregunta supone que sabes lo que estás haciendo y quieres un Deferred .
Para empezar, una función casi nunca debería devolver un Deferred que provenga de un bloque async . Depende de la persona que llama envolver alguna unidad de trabajo en un async mientras realiza otro trabajo en primer plano, luego await el resultado asíncrono antes de regresar y envolver todo ese código en un coroutineScope .
La fuente prevista de las instancias Deferred es la capa de adaptación entre las corrutinas de Kotlin y las API asíncronas de terceros. Para tales llamadas, tiene sentido poner Async en el nombre e incluso algunas API de Java siguen esta convención. Por ejemplo, usted puede tener un
fun fetchOrder(id: String): Deferred<Order>y usarlo como
val orderCancelled = fetchOrder(orderId).isCancelled Este código es de tipo seguro y correcto, no causa ningún error de compilación. Parece que está obteniendo un pedido de un sistema remoto y luego verifica el estado del pedido (si está cancelado), pero lo que realmente está haciendo es obtener un Deferred<Order> aplazado y verificar si el Deferred está cancelado. Debido a que al nombre de su función le falta Async , este tipo de error es difícil de detectar.
Sí, también puede solicitar al IDE que le proporcione el tipo de devolución, pero puede pasar un tiempo antes de que sospeche lo que está sucediendo.
Deferred no devuelve el valor real, pero es "un futuro ligero sin bloqueo que representa una promesa de proporcionar un resultado más adelante".
Como no puede ver esto en el nombre del método, "nombramos tales funciones con el sufijo "...Async" para resaltar el hecho de que solo inician el cálculo asíncrono y uno necesita usar el valor diferido resultante para obtener el resultado".
Entonces, el lector de su código puede ver instantáneamente que su método no devuelve el valor real, pero además tiene que llamar a await() en él.
A su segundo punto sobre la función de suspend :
Por lo general, es al revés, la función xyzAsync() llama a la función suspend xyz() .
Como las funciones que devuelven Deferred se pueden llamar desde cualquier lugar, no solo desde las funciones suspendidas.