Errores y patrones frecuentes de asincronía JavaScript | Nicolás Garzón
JavaScript
Copiar function saveOrder ( order ) {
return repository. save ( order) ;
} El consumidor puede esperar y manejar errores.
JavaScript
Copiar let status = "idle" ; Modela transiciones claras:
Texto
Copiar idle → loading → success
↘ errorUna respuesta anterior no debería sobrescribir una solicitud nueva.
JavaScript
Copiar void sendTelemetry ( ) . catch ( reportError) ; void comunica que no se esperará el valor, pero el rechazo sigue teniendo responsable.
JavaScript
Copiar new Promise ( async ( resolve, reject ) => {
const value = await loadValue ( ) ;
resolve ( value) ;
} ) ; El constructor no espera la promesa retornada por el executor. Usa una función async directamente o encadena la operación.
JavaScript
Copiar try {
return await loadBalance ( ) ;
} catch {
return 0 ;
} Un fallo no significa saldo cero.
JavaScript
Copiar const first = await loadFirst ( ) ;
const second = await loadSecond ( ) ; Si no dependen, inicia ambas juntas.
JavaScript
Copiar await Promise. all ( items. map ( saveItem) ) ; Puede ser excesivo. Decide un límite.
JavaScript
Copiar const result = await load ( query) ;
render ( result) ; Mientras esperabas, query o la pantalla pudieron cambiar. Usa IDs, versiones o cancelación para confirmar que el resultado sigue vigente.
JavaScript
Copiar const controller = new AbortController ( ) ;
const timeoutId = setTimeout (
( ) => controller. abort ( ) ,
5000 ,
) ;
try {
return await operation ( controller. signal) ;
} finally {
clearTimeout ( timeoutId) ;
} Todo recurso creado por un flujo necesita una ruta de cierre.
Una callback de evento no tiene un consumidor que espere automáticamente su promesa.
JavaScript
Copiar button. addEventListener ( "click" , async ( ) => {
await save ( ) ;
} ) ; Un rechazo puede quedar sin manejar.
JavaScript
Copiar button. addEventListener ( "click" , ( ) => {
void save ( ) . catch ( showError) ;
} ) ; JavaScript
Copiar const previous = state;
state = applyOptimisticUpdate ( state, change) ;
try {
await saveChange ( change) ;
} catch ( error) {
state = previous;
throw error;
} Necesita considerar cambios posteriores; restaurar un snapshot antiguo puede borrar trabajo nuevo. Usa IDs, patches o mecanismos de reconciliación.
Un retry solo es seguro cuando repetir la operación no duplica efectos o existe una clave de idempotencia.
En un proceso por lotes, conserva contexto por elemento.
JavaScript
Copiar const results = await Promise. allSettled (
items. map ( processItem) ,
) ;
const failures = results. flatMap ( ( result, index ) =>
result. status === "rejected"
? [ { index, reason : result. reason } ]
: [ ] ,
) ;
Operación.
Duración.
Estado final.
Correlation ID.
Reintentos.
Cancelación.
Causa segura.
No registres tokens ni cuerpos sensibles.
Antes de cerrar un flujo:
¿La función retorna la promesa?
¿Existe un responsable del rechazo?
¿Las operaciones son dependientes o independientes?
¿Hay un límite de concurrencia?
¿Puede cancelarse?
¿Puede llegar una respuesta obsoleta?
¿Qué efectos ya ocurrieron si falla?
¿Es seguro reintentar?
¿Qué debe limpiarse?
¿Cómo se diagnostica en producción?
Executor async dentro de new Promise.
Callbacks async ignoradas por APIs síncronas.
Promesas flotantes.
Fallbacks que cambian el significado.
Falta de cancelación.
Respuestas fuera de orden.
Reintentos sin idempotencia.
Concurrencia ilimitada.
Limpieza incompleta.
Logs sin contexto o con secretos.
Todo trabajo asíncrono necesita dueño.
Retorna promesas o maneja explícitamente fire-and-forget.
Define orden y límites según el dominio.
Usa cancelación para trabajo obsoleto.
Los efectos parciales no desaparecen al rechazar.
Reintentos necesitan idempotencia.
El estado puede cambiar durante await.
Diseña limpieza y observabilidad desde el inicio.
¿Qué tres problemas tiene una promesa flotante?
Respuesta El llamador no puede esperar su finalización, el rechazo puede quedar sin manejar y la operación puede sobrevivir más tiempo del necesario sin cancelación ni limpieza coordinada.
Módulos JavaScript inicia el bloque de organización y dependencias del lenguaje.