yield

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since September 2016.

A palavra-chave yield é usada para pausar e resumir uma generator function (function* or generator function legada).

Sintaxe

[rv] = yield [expressão];
expressão

Define o valor que retorna de uma generator function via o protocolo iterator. Se omitido, será retornado undefined.

rv

Retorna o valor opcional passado para o metódo next() do generator e resume sua execução.

Descrição

A palavra-chave yield pausa a execução de uma generator function e o valor da expressão em frente a palavra-chave yield é retornado para a chamada do generator. Ele pode ser considerado uma versão da palavra-chave return para o generator.

A palavra-chave yield atualmente retorna um objeto do tipo IteratorResult com duas propriedades, value e done. A propriedade value é o resultado da avaliação da expressão yield, e done é false, indicando que a generator function não foi totalmente completada.

Uma vez pausado em uma expressão yield, a execução do código do generator permanece pausado até a próxima chamada do métod next(). Cada vez que o método next() do generator é chamado, o generator resume a execução e roda até atingir um dos seguintes estados:

  • Um yield, que causa a pausa do generator novamente e retorna seu novo valor. Na próxima vez que next() for chamado, a execução resumirá com a declaração imediamente após yield.
  • throw é usado para invocar uma exception à partir do generator. Isso irá parar completamente a execução do generator, e a execução resume para onde foi chamado o generator normalmente no caso que uma exception é invocada.
  • O final de uma generator function é atingido; nesse caso, a execução do generator termina e um IteratorResult é retornado para onde o generator foi chamado no qual o value é undefined e done é true.
  • Uma declaração return é atingida. Nesse caso, a execução do generator termina e um IteratorResult é retornado para onde o generator foi chamado no qual o value é o valor especificado pela declaração return statement e done é true.

Se um valor opcional é passado para o método next() do generator, esse valor se torna o valor retornado pela operação yield atual do generator.

Entre o caminho de código do generator, os seus operadores yield, e a habilidade de especificar um novo valor inicial passando isso para o Generator.prototype.next(), generators oferecem um poder e controle enormes

Exemplos

O código seguinte é a declaração de um exemplo de uma generator function.

js
function* foo() {
  var index = 0;
  while (index <= 2) yield index++;
}

Uma vez que a generator function é definida, isso pode ser usada para construir um iterator como mostrado a seguir:

js
var iterator = foo();
console.log(iterator.next()); // { value: 0, done: false }
console.log(iterator.next()); // { value: 1, done: false }
console.log(iterator.next()); // { value: 2, done: false }
console.log(iterator.next()); // { value: undefined, done: true }

Especificações

Specification
ECMAScript® 2025 Language Specification
# prod-YieldExpression

Compatibilidade com navegadores

Report problems with this compatibility data on GitHub
desktopmobileserver
Chrome
Edge
Firefox
Opera
Safari
Chrome Android
Firefox for Android
Opera Android
Safari on iOS
Samsung Internet
WebView Android
WebView on iOS
Deno
Node.js
yield

Legend

Tip: you can click/tap on a cell for more information.

Full support
Full support
See implementation notes.

Notas específicas do Firefox

  • A partir do Gecko 29, uma generator function completada não invoca mais um TypeError "generator has already finished". Ao invés, isso retorna um objeto IteratorResult como { value: undefined, done: true } (Erro do Firefox 958951).

  • A partir do Gecko 33, a análise (parsing) de uma expressão yield foi atualizada para se conformar com a especificação do ES2015 (Erro do Firefox 981599):

    • A expressão após a palavra-chave yield é opcional e omitir isso não invoca mais um SyntaxError: function* foo() { yield; }

Veja também