[ Web Proxy ]
URL:
Viewing: https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Operators/yield [Back]  [Original]

yield - JavaScript | MDN

Esta pgina ha sido traducida del ingls por la comunidad. Aprende ms y nete a la comunidad de MDN Web Docs.

View in English Always switch to English

yield

Baseline Widely available

This feature is well established and works across many devices and browser versions. Its been available across browsers since septiembre de 2016.

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

In this article

Prubalo

function* foo(index) {
  while (index < 2) {
    yield index;
    index++;
  }
}

const iterator = foo(0);

console.log(iterator.next().value);
// Expected output: 0

console.log(iterator.next().value);
// Expected output: 1

Sintaxis

[rv] = yield [expression]
expression Opcional

Define el valor que se devolver desde la funcin generadora a travs del protocolo iterador. Si se omite, devuelve undefined en su lugar.

rv Opcional

Recupera el valor opcional pasado al mtodo next() del generador para reanudar su ejecucin.

Descripcin

La palabra clave yield detiene la ejecucin de la funcin del generador y el valor de la expresin que sigue a la palabra clave yield se devuelve al llamador del generador. Se puede considerar como una versin basada en un generador de la palabra clave return.

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

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

Una vez en pausa en una expresin yield, la ejecucin del cdigo del generador permanece en pausa hasta que se llama al mtodo next() del generador. Cada vez que se llama al mtodo next() del generador, el generador reanuda la ejecucin 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 prxima vez que se llame a next(), la ejecucin se reanudar con la instruccin inmediatamente despus de yield.
  • throw se usa para lanzar una excepcin desde el generador. Esta detiene la ejecucin del generador por completo y la ejecucin se reanuda en el llamador (como suele ser el caso cuando se lanza una excepcin).
  • Se alcanza el final de la funcin generadora. En este caso, la ejecucin del generador finaliza y se devuelve un IteratorResult al llamador en el que el value es undefined y done es true.
  • Se alcanza una instruccin return. En este caso, la ejecucin del generador finaliza y se devuelve un IteratorResult al llamador en el que el value es el valor especificado por la instruccin return y done es true.

Si se pasa un valor opcional al mtodo next() del generador, ese valor se convierte en el valor devuelto por la operacin yield actual del generador.

Entre la ruta del cdigo del generador, sus operadores yield y la capacidad de especificar un nuevo valor inicial pasndolo a Generator.prototype.next(), los generadores ofrecen enorme poder y control.

Advertencia: Desafortunadamente, next() es asimtrico, pero eso no se puede evitar: siempre enva un valor al yield actualmente suspendido, pero devuelve el operando del siguiente yield.

Ejemplos

Usar yield

El siguiente cdigo es la declaracin de una funcin generadora de ejemplo.

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

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

js
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 }

Tambin puedes enviar un valor con next(value) al generador. 'step' se evala como un valor de retorno en esta sintaxis [rv] = yield [expression]

js
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

Specification
ECMAScript 2027 LanguageSpecification
# prod-YieldExpression

Compatibilidad con navegadores

Ve tambin


Web Proxy Viewer  |  New URL  |  Original Page