Quiero reiniciar la iteración después de que el iterador llegue al estado terminado. Solo mira el ejemplo:
const newMap = new Map<string, string>([ ['key1', 'value1'], ['key2', 'value2'] ]); const iterator = newMap.values() // It can be newMap.entries() iterator.next().value // prints value1 iterator.next().value //prints value2 iterator.next().value //prints undefinedSolo quiero algo como:
iterator.restart(); iterator.next().value // prints value1Llame .values (o el método que sea) nuevamente.
const newMap = new Map([ ['key1', 'value1'], ['key2', 'value2'] ]); let iterator = newMap.values() // It can be newMap.entries() console.log(iterator.next().value) // prints value1 console.log(iterator.next().value) //prints value2 console.log(iterator.next().value) //prints undefined iterator = newMap.values() console.log(iterator.next().value) // prints value1Los iteradores no son reutilizables; debe crearlos de nuevo cada vez que desee comenzar desde el principio.
Si desea repetir valores sin fin, puede crear una función de generador que almacene en caché los valores la primera vez y luego siga brindándole los valores almacenados en caché desde el principio para siempre:
function* repeat(iterable) { const cache = []; //lazily supply the values from the iterable while caching them for (const next of iterable) { cache.push(next); yield next; } //delegate to the cache at this point while(true) yield* cache; } const newMap = new Map([ ['key1', 'value1'], ['key2', 'value2'] ]); const iterator = repeat(newMap.values()) // It can be newMap.entries() console.log(iterator.next().value) // prints value1 console.log(iterator.next().value) // prints value2 console.log(iterator.next().value) // prints value1 console.log(iterator.next().value) // prints value2 console.log(iterator.next().value) // prints value1 console.log(iterator.next().value) // prints value2 Alternativamente, si no desea almacenar en caché, puede hacer que la implementación de repeat() sea más simple tomando una función que le proporcione un iterable. Cada vez que lo llama, obtiene uno nuevo y lo delega para siempre:
function* repeat(iterableSupplier) { //delegate to the value from the supplier while(true) yield* iterableSupplier(); } const newMap = new Map([ ['key1', 'value1'], ['key2', 'value2'] ]); const iterator = repeat(() => newMap.values()) // It can be newMap.entries() // give a function ^^^^^ console.log(iterator.next().value) // prints value1 console.log(iterator.next().value) // prints value2 console.log(iterator.next().value) // prints value1 console.log(iterator.next().value) // prints value2 console.log(iterator.next().value) // prints value1 console.log(iterator.next().value) // prints value2Ver más sobre:
function* - funciones del generadoryield* - delegar a otro iterablePodría crear su propio iterador que, cuando se le solicite, vuelva a llamar a newMap.values():
const newMap = new Map([ ['key1', 'value1'], ['key2', 'value2'] ]); const myIterator = (() => { let currentIterator = newMap.values(); return { next() { return currentIterator.next(); }, restart() { currentIterator = newMap.values(); } } })() console.log(myIterator.next().value) // prints value1 console.log(myIterator.next().value) //prints value2 console.log(myIterator.next().value) //prints undefined myIterator.restart(); console.log(myIterator.next().value) // prints value1