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(), 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

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!
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