Saltar al contenido
Normalizar un callback síncrono o asíncrono

    ↑↓ mover · ⏎ abrir · esc cerrar

    Patrones

    ¿Cómo acepto callbacks que devuelven `T` o `Promise<T>` y expongo siempre un resultado predecible?

    Acepta un valor o promesa, espéralo y describe el resultado aplanado con `Awaited`.

    La receta

    type MaybePromise<T> = T | Promise<T>
    
    async function run<T>(
      task: () => MaybePromise<T>,
    ): Promise<Awaited<T>> {
      return (await task()) as Awaited<T>
    }
    
    const syncResult = run(() => 42)
    const asyncResult = run(async () => 'ready')

    La compilación compila esto y comprueba cada resultado de abajo.

    Cómo funciona

    1. 01
      type MaybePromise<T> = T | Promise<T>

      El contrato permite implementaciones inmediatas y diferidas.

    2. 02
      Promise<Awaited<T>>

      El resultado público es siempre asíncrono y las promesas anidadas se aplanan.

    Lo que obtienes

    Dónde falla

    La API resultante siempre es asíncrona, incluso para un callback síncrono. No uses este envoltorio si los llamantes dependen de excepciones inmediatas o finalización en el mismo ciclo.

    Conclusión

    Normaliza entradas flexibles en el límite para que todos consuman una forma de salida estable.

    Véase también

    Patrones