Qué significa Generador ya cerrado y cómo solucionarlo
Referencia del error
Generador ya cerrado
Lenguaje
Severidad
BajaCuándo ocurre
Una vez que una función generadora retorna (o su cuerpo se agota), llamar a .next() sobre ella devuelve { value: undefined, done: true } silenciosamente en lugar de lanzar un error.
Posibles soluciones
Siempre verifica la propiedad done de los resultados de .next(). Usa bucles for...of que manejan la señal done automáticamente. Si necesitas una fuente reiniciable de valores, recrea el generador en lugar de reutilizar uno cerrado.
Errores relacionados
Más detalles
Una vez que una función generadora retorna (o su cuerpo se agota), llamar a .next() sobre ella devuelve { value: undefined, done: true } silenciosamente en lugar de lanzar un error. Esto puede causar bugs sutiles donde un bucle o consumidor deja silenciosamente de recibir valores sin ninguna indicación del porqué.
Por qué ocurre
- •Llamar a .next() después de que el generador ya haya retornado o lanzado.
- •Una sentencia return anticipada sale del generador antes de que se hayan producido todos los valores.
- •Llamar a gen.return() cierra explícitamente el generador.
- •Una excepción lanzada dentro del generador lo cierra.
Posibles soluciones
Siempre verifica la propiedad done de los resultados de .next(). Usa bucles for...of que manejan la señal done automáticamente. Si necesitas una fuente reiniciable de valores, recrea el generador en lugar de reutilizar uno cerrado.
Ejemplos
Código que causa el error
function* counter() {
yield 1;
yield 2;
}
const gen = counter();
console.log(gen.next()); // { value: 1, done: false }
console.log(gen.next()); // { value: 2, done: false }
console.log(gen.next()); // { value: undefined, done: true }
console.log(gen.next()); // { value: undefined, done: true } -- silently no-opsError en la terminal
{ value: 1, done: false }
{ value: 2, done: false }
{ value: undefined, done: true }
{ value: undefined, done: true }Código corregido
function* counter() {
yield 1;
yield 2;
}
const gen = counter();
let result = gen.next();
while (!result.done) {
console.log(result.value);
result = gen.next();
}Practica en inglés
¿Cómo le explicarías un Generator Already Closed a un compañero dev? Elige la frase correcta:
"I hit an error...
¿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