Lingua-e
JavaScript

¿Qué significa Generador ya cerrado?

← Errores

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.

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ómo solucionarlo

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.

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();
}

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