Lingua-e
← Errores
JavaScript

Qué significa Generador ya cerrado y cómo solucionarlo

Referencia del error

Generador ya cerrado

Lenguaje

JavaScript

Severidad

Baja

Cuá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

JavaScript

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-ops

Error 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