yield

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 √© undefineddone √© 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() (en-US), 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

Especificação Situação Comentário
ECMAScript 2015 (6th Edition, ECMA-262)
The definition of 'Yield' in that specification.
Padrão Definição inicial.
ECMAScript (ECMA-262)
The definition of 'Yield' in that specification.
Padr√£o em tempo real  

Compatibilidade de navegadores

Estamos convertendo nossos dados de compatibilidade para o formato JSON. Esta tabela de compatibilidade ainda usa o formato antigo, pois ainda não convertemos os dados que ela contém. Descubra como você pode ajudar! (en-US)

Feature Chrome Edge Firefox (Gecko) Internet Explorer Opera Safari (WebKit)
Basic support 39 (Yes) 26.0 (26.0) ? ? 10
IteratorResult object instead of throwing ? ? 29.0 (29.0) ? ? 10
Feature Android Edge Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Basic support (Yes) (Yes) 26.0 (26.0) ? ? 10
IteratorResult object instead of throwing ? ? 29.0 (29.0) ? ? 10

Notas específicas do Firefox

  • A partir do Gecko 29 (Firefox 29 / Thunderbird 29 / SeaMonkey 2.26), 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 } (bug 958951).
  • A partir do Gecko 33 (Firefox 33 / Thunderbird 33 / SeaMonkey 2.30), a an√°lise (parsing) de uma express√£o yield foi atualizada para se conformar com a especifica√ß√£o do ES2015 (bug 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