yield

La palabra clave yield se usa para pausar y reanudar una funci贸n generadora (function* o funci贸n generadora heredada).

Sintaxis

[rv] = yield [expression]
expression Optional
Define el valor que se devolver谩 desde la funci贸n generadora a trav茅s del protocolo iterador. Si se omite, devuelve undefined en su lugar.
rv Optional

Recupera el valor opcional pasado al m茅todo next() del generador para reanudar su ejecuci贸n.

Descripci贸n

La palabra clave yield detiene la ejecuci贸n de la funci贸n del generador y el valor de la expresi贸n que sigue a la palabra clave yield se devuelve al llamador del generador. Se puede considerar como una versi贸n basada en un generador de la palabra clave return.

yield solo se puede llamar directamente desde la funci贸n generadora que la contiene. No se puede llamar desde funciones anidadas o retrollamadas.

La palabra clave yield hace que la llamada al m茅todo next() del generador devuelva un objeto IteratorResult con dos propiedades: value y done. La propiedad value es el resultado de evaluar la expresi贸n yield, y done es false, lo cual indica que la funci贸n generadora no se ha completado completamente.

Una vez en pausa en una expresi贸n yield, la ejecuci贸n del c贸digo del generador permanece en pausa hasta que se llama al m茅todo next() del generador. Cada vez que se llama al m茅todo next() del generador, el generador reanuda la ejecuci贸n y se ejecuta hasta que alcanza uno de los siguientes:

  • Un yield, el cual hace que el generador vuelva a pausar y devuelva el nuevo valor del generador. La pr贸xima vez que se llame a next(), la ejecuci贸n se reanudar谩 con la instrucci贸n inmediatamente despu茅s de yield.
  • throw se usa para lanzar una excepci贸n desde el generador. Esta detiene la ejecuci贸n del generador por completo y la ejecuci贸n se reanuda en el llamador (como suele ser el caso cuando se lanza una excepci贸n).
  • Se alcanza el final de la funci贸n generadora. En este caso, la ejecuci贸n del generador finaliza y se devuelve un IteratorResult al llamador en el que el value es undefined y done es true.
  • Se alcanza una instrucci贸n return. En este caso, la ejecuci贸n del generador finaliza y se devuelve un IteratorResult al llamador en el que el value es el valor especificado por la instrucci贸n return y done es true.

Si se pasa un valor opcional al m茅todo next() del generador, ese valor se convierte en el valor devuelto por la operaci贸n yield actual del generador.

Entre la ruta del c贸digo del generador, sus operadores yield y la capacidad de especificar un nuevo valor inicial pas谩ndolo a Generator.prototype.next(), los generadores ofrecen enorme poder y control.

Desafortunadamente, next() es asim茅trico, pero eso no se puede evitar: siempre env铆a un valor al yield actualmente suspendido, pero devuelve el operando del siguiente yield.

Ejemplos

Usar yield

El siguiente c贸digo es la declaraci贸n de una funci贸n generadora de ejemplo.

function* countAppleSales () {
  let saleList = [3, 7, 5]
  for (let i = 0; i < saleList.length; i++) {
    yield saleList[i]
  }
}

Una vez que se define una funci贸n generadora, se puede usar construyendo un iterador como el siguiente.

let appleStore = countAppleSales()  // Generator { }
console.log(appleStore.next())      // { value: 3, done: false }
console.log(appleStore.next())      // { value: 7, done: false }
console.log(appleStore.next())      // { value: 5, done: false }
console.log(appleStore.next())      // { value: undefined, done: true }

Tambi茅n puedes enviar un valor con next(value) al generador. 'step' se eval煤a como un valor de retorno en esta sintaxis [rv] = yield [expression]

function* counter(value) {
 let step;

 while (true) {
   step = yield ++value;

   if (step) {
     value += step;
   }
 }
}

const generatorFunc = counter(0);
console.log(generatorFunc.next().value);   // 1
console.log(generatorFunc.next().value);   // 2
console.log(generatorFunc.next().value);   // 3
console.log(generatorFunc.next(10).value); // 14
console.log(generatorFunc.next().value);   // 15
console.log(generatorFunc.next(10).value); // 26

Especificaciones

Especificaci贸n
ECMAScript (ECMA-262)
La definici贸n de 'Yield' en esta especificaci贸n.

Compatibilidad del navegador

BCD tables only load in the browser

Ve tambi茅n