Llamar a resolve() o reject() más de una vez dentro del constructor de una Promise se ignora silenciosamente. Una Promise solo puede resolverse una vez. Esto no es un error en sí, pero es una fuente común de bugs sutiles donde los desarrolladores esperan múltiples valores o callbacks de una sola promesa.
Por qué ocurre
- •Una API basada en callbacks llama a su callback más de una vez, y cada llamada activa resolve.
- •Tanto una ruta de éxito como una de error llaman a resolve en lugar de que una llame a reject.
- •Un escuchador de eventos dentro del constructor de una Promise se dispara múltiples veces.
Ejemplos
Código que causa el error
const p = new Promise((resolve, reject) => {
resolve("first");
resolve("second"); // silently ignored
reject(new Error("oops")); // also silently ignored
});
const val = await p;
console.log(val); // "first"Error en la terminal
first // No error is thrown. The second resolve and the reject are silently ignored.
Cómo solucionarlo
Las Promises modelan un único valor futuro. Para múltiples valores, usa un EventEmitter, RxJS Observable o un generador asíncrono. Asegúrate de que cada ruta de código dentro del ejecutor de Promise llame exactamente una vez a resolve o reject, y luego retorne.
Código corregido
// Promise state is immutable once settled.
// If you need multiple values, use an event emitter or async generator.
async function* stream() {
yield "first";
yield "second";
}
for await (const val of stream()) {
console.log(val);
}Errores relacionados
¿Listo para practicar tu inglés en el trabajo?
Lingua-e tiene ejercicios interactivos basados en conversaciones reales de developers: standups, code reviews, retrospectivas y más. Practica hasta que salga solo.
Prueba Lingua-e gratis