Generators are functions that can be exted and later re-entered. Seu contexto (bindings de variáveis) será salvo em reentrâncias.
Geradores em JavaScript — especialmente quando combinados com Promises — são uma ferramenta muito poderosa para programação assíncrona, pois mitigam — se não eliminam completamente — os problemas com callbacks, como Callback Hell e Inversão de Controle. Entretanto, uma solução ainda mais simples para esses problemas pode ser alcançada com funções assíncronas.
Chamar uma função geradora não executa seu corpo imediatamente; um objeto iterador para a função é retornado em seu lugar. Quando o método do iterador next()
é chamado, o corpo da função geradora é executado até a primeira expressão yield
, que especifica o valor a ser retornado do iterador ou, com yield*
, delega a outra função geradora. O método next()
retorna um objeto com uma propriedade value
contendo o valor renderizado e uma propriedade done
que indica se o gerador produziu seu último valor, como um booleano. Chamando o método next()
com um argumento irá retomar a execução da função do gerador, substituindo a expressão yield
onde uma execução foi pausada pelo argumento de next()
.
A return
comando em um gerador, quando executado, fará com que o gerador termine (ou seja, a propriedade done
do objeto retornado por ele será definida como true
). Se um valor for retornado, ele será definido como a propriedade value
do objeto retornado pelo gerador.
Tal como uma declaração return
, um erro é lançado dentro do gerador fará com que o gerador termine — a menos que seja pego dentro do corpo do gerador.
Quando um gerador terminar, chamadas subsequentes next()
não executarão nenhum código desse gerador, elas apenas retornarão um objeto desse formulário: {value: undefined, done: true}
.