expressão yield* é usada para delegar para outro objeto generator ou iterable.

Sintaxe

 yield* [[expressão]];
expressão
A expressão que retorna um objeto iterable.

Descrição

A expressão yield* itera sobre a operação e yields cada valor retornado por ele.

O valor da expressão yield* sozinha é o valor retornado pelo iterator quando ele for fechado (i.e., quando done é true).

Exemplos

Delegando para outro generator

No código seguinte, valores "yeldados" por g1() são retornados por next() chamam apenas os que foram "yeldados" por g2().

function* g1() {
  yield 2;
  yield 3;
  yield 4;
}

function* g2() {
  yield 1;
  yield* g1();
  yield 5;
}

var iterator = g2();

console.log(iterator.next()); // {value: 1, done: false}
console.log(iterator.next()); // {value: 2, done: false}
console.log(iterator.next()); // {value: 3, done: false}
console.log(iterator.next()); // {value: 4, done: false}
console.log(iterator.next()); // {value: 5, done: false}
console.log(iterator.next()); // {value: undefined, done: true}

Outros objetos Iterables

Além de objetos generator, yield* também podem yield outros tipos de objetos iterables, e.g. arrays, strings ou objetos de argumentos.

function* g3() {
  yield* [1, 2];
  yield* '34';
  yield* Array.from(arguments);
}

var iterator = g3(5, 6);

console.log(iterator.next()); // {value: 1, done: false}
console.log(iterator.next()); // {value: 2, done: false}
console.log(iterator.next()); // {value: "3", done: false}
console.log(iterator.next()); // {value: "4", done: false}
console.log(iterator.next()); // {value: 5, done: false}
console.log(iterator.next()); // {value: 6, done: false}
console.log(iterator.next()); // {value: undefined, done: true}

O valor da expressão yield* sozinha

yield* é uma expressão, não uma declaração, então ele espera um valor.

function* g4() {
  yield* [1, 2, 3];
  return 'foo';
}

var result;

function* g5() {
  result = yield* g4();
}

var iterator = g5();

console.log(iterator.next()); // {value: 1, done: false}
console.log(iterator.next()); // {value: 2, done: false}
console.log(iterator.next()); // {value: 3, done: false}
console.log(iterator.next()); // {value: undefined, done: true}, 
                              // g4() returned {value: 'foo', done: true} nesse ponto

console.log(result);          // "foo"

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 Latest Draft (ECMA-262)
The definition of 'Yield' in that specification.
Rascunho  

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 (Yes) (Yes) 27.0 (27.0) ? ? 10
Feature Android Edge Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Basic support (Yes) (Yes) 27.0 (27.0) ? ? 10

Notas específicas do Firefox

  • A partir do Gecko 33 (Firefox 33 / Thunderbird 33 / SeaMonkey 2.30), o tratamento da expressão yield foi atualizado para se conformar com a espeficação do ES2015 (bug 981599):
    • A restrição de linha finalizadora agora está implementada. Nenhuma linha finalizadora entre "yield" e "*" é permitida. Código como o a seguir irá invocar uma exception SyntaxError:
      function* foo() {
        yield
        *[];
      }

Veja também

Etiquetas do documento e colaboradores

Colaboradores desta página: alefesouza
Última atualização por: alefesouza,