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