¿Es posible recorrer parte de un iterador con for...of sin cerrar el iterador cuando rompo el ciclo?
Ejemplo:
function* numbers(i=0){ while(true) yield i++; } let nums=numbers(); // this loop prints numbers from 0 to 3 for(const n of nums){ if(n>3) break; console.log(n); } // this loop doesn't print anything because `nums` has already been closed for(const n of nums){ if(n>10) break; console.log(n); } Sé que puedo pasar por el iterador por mi cuenta llamando a iterator.next() . Pero me pregunto si es posible hacer esto con la sintaxis for...of .
No. Sin embargo, puede proporcionar un contenedor que no reenvíe return() al generador:
function unclosed(iterable) { return { [Symbol.iterator]() { const iterator = iterable[Symbol.iterator](); return { next: iterator.next.bind(iterator), return: null, throw: null, }; }, }; } function* numbers(i=0) { try { while (true) yield i++; } finally { console.log('done'); } } const nums = numbers(); // this loop prints numbers from 0 to 3 for (const n of unclosed(nums)) { console.log(n); if (n == 3) break; } // and this one the numbers from 4 to 10, as well as 'done' for (const n of nums) { console.log(n); if (n == 10) break; }