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 quenext()
for chamado, a execução resumirá com a declaração imediamente apósyield
. 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 ovalue
éundefined
edone
étrue
. - Uma declaração
return
é atingida. Nesse caso, a execução do generator termina e umIteratorResult
é retornado para onde o generator foi chamado no qual ovalue
é o valor especificado pela declaraçãoreturn
statement edone
é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.
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:
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 Language Specification # prod-YieldExpression |
Compatibilidade com navegadores
BCD tables only load in the browser
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 objetoIteratorResult
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 umSyntaxError
:function* foo() { yield; }
- A expressão após a palavra-chave