una - Rendimiento de Javascript de la función anidada dentro del generador.
mandar a llamar una funcion dentro de otra funcion en javascript (4)
Este código genera un error:
function *giveNumbers() {
[1, 2, 3].forEach(function(item) {
yield item;
})
}
Esto es probablemente porque el rendimiento está dentro de una función que no es un generador. ¿Hay una manera elegante de superar esto? Me refiero a otra cosa que
function *giveNumbers() {
let list = [1, 2, 3];
for (let i = 0; i < list.length; i++) {
yield list[i];
}
}
Esto es probablemente porque el rendimiento está dentro de una función que no es un generador.
Sí. No se puede utilizar el yield
de las devoluciones de llamada.
¿Hay una manera elegante de superar esto?
Depende del caso de uso. Por lo general, no hay ninguna razón para querer yield
partir de una devolución de llamada.
En su caso, usted quiere un for…of
loop, que es superior a .forEach
en casi todos los aspectos de todos modos:
function *giveNumbers() {
for (let item of [1, 2, 3])
yield item;
}
Puedes usar la sintaxis de yield *
.
function *giveNumbers() {
yield * [1, 2, 3].map(function(item) {
return item;
})
}
También puede usar while
y pasar argumentos como tales ( Demo )
function *giveNumbers(array, start) {
var index = start || 0;
while(array.length > index + 1) {
yield array[index++];
}
return array[index];
}
var g = giveNumbers([1,2,3], 0);
var finished = false;
while(!finished) {
var next = g.next();
console.log(next.value);
if(next.done) {
finished = true;
}
}
rendimiento devuelve el resultado a la persona que llama.
supongamos que la forEach
llamada forEach
es un generador (no es un problema configurar un generador de vestuario allí). Significa que cuando la devolución de llamada yield
el resultado, devuelve a forEach
.
Básicamente, en tu pregunta lo que intentas hacer es:
callback -> yields to forEach -> yields to giveNumbers -> yields to caller
Por lo tanto, forEach
debe forEach
el resultado a giveNumbers
. pero como forEach
no funciona así, es imposible sin prototipos de arreglos con el disfraz para cada forEach
.
En realidad, tu segundo fragmento es el más elegante para empezar.