SC #4: Sintaxis async/await
Source: Dev.to
Declaración de funciones async/await
Una función asíncrona debe marcarse con la palabra clave async.
Si la función puede lanzar un error, se añade la palabra clave throws después de async.
Si la función no arroja errores, throws puede omitirse.
func fetchData() async throws -> Data {
// …
// ❌ Error de compilación: se debe retornar un valor o lanzar un error
}
Al usar la sintaxis async throws, la función siempre debe devolver un valor o lanzar un error.
Uso de closures
Al trabajar con closures, es fácil olvidar invocarlos, lo que genera errores lógicos (por ejemplo, no notificar un error ni retornar un valor).
func fetchData(_ completion: @escaping (Data?, Error?) -> Void) {
// No se invoca el bloque `completion(_: )`, lo cual sería un error
}
Ejecutar código async desde un contexto síncrono con Task
Task crea un contexto asíncrono dentro de uno síncrono, permitiendo llamar a un método async desde una función que no soporta concurrencia.
Task {
try await fetchData()
}
Si no se usa Task, se produce el error:
'async' call in a function that does not support concurrency
Conceptos clave
- async: indica que la función ejecuta trabajo asíncrono.
- await: pausa la ejecución hasta que la función asíncrona termina.
- throws: propaga errores.