Koa.js - Geradores

Um dos novos recursos mais interessantes do JavaScript ES6 é uma nova espécie de função, chamada de gerador. Antes dos geradores, todo o script era usado para executar normalmente de cima para baixo, sem uma maneira fácil de parar a execução do código e retomar com a mesma pilha posteriormente. Geradores são funções que podem ser encerradas e posteriormente reinseridas. Seu contexto (ligações de variáveis) serão salvos nas reentradas.

Os geradores nos permitem interromper a execução do código no meio. Portanto, vamos dar uma olhada em um gerador simples.

var generator_func = function* (){
   yield 1;
   yield 2;
};

var itr = generator_func();
console.log(itr.next());
console.log(itr.next());
console.log(itr.next());

Ao executar o código acima, o resultado será o seguinte.

{ value: 1, done: false }
{ value: 2, done: false }
{ value: undefined, done: true }

Vamos dar uma olhada dentro do código acima. Primeiro criamos um gerador chamadogenerator_func(). Criamos uma instância desta função de aparência estranha e atribuímos aitr. Então começamos a ligarnext() nesta variável itr.

Chamar next () inicia o gerador e ele funciona até atingir um rendimento. Em seguida, retorna o objeto com valor e feito, onde o valor possui a expressão valor. Esta expressão pode ser qualquer coisa. Neste ponto, ele pausa a execução. Novamente, quando chamamos esta função (próxima), o gerador retoma a execução do último ponto de rendimento com o estado da função sendo o mesmo no momento da pausa, até o próximo ponto de rendimento. Isso é feito até que não haja mais pontos de rendimento no código.

Geradores em Koa

Então, por que estamos discutindo geradores neste tutorial. Como você deve se lembrar do programa hello world, usamos umfunction* ()notação para passar um retorno de chamada para app.use (). Koa é um objeto que contém uma matriz de funções geradoras de middleware, todas compostas e executadas como uma pilha a cada solicitação. Koa também implementa o downstreaming seguido pelo upstreaming do fluxo de controle.

Dê uma olhada no exemplo a seguir para entender isso de uma maneira melhor.

var koa = require('koa');
var app = koa();
 
app.use(function* (next) {
   //do something before yielding to next generator function 
   
   //in line which will be 1st event in downstream
   console.log("1");
   yield next;
 
   //do something when the execution returns upstream, 
   //this will be last event in upstream
   console.log("2");
});
app.use(function* (next) {
   // This shall be 2nd event downstream
   console.log("3");
   yield next;
 
   // This would be 2nd event upstream
   console.log("4");
});
app.use(function* () { 
   // Here it would be last function downstream
   console.log("5");
   
   // Set response body
   this.body = "Hello Generators";

   // First event of upstream (from the last to first)
   console.log("6");
});

app.listen(3000);

Ao executar o código acima e navegar para https://localhost:3000/ obtemos a seguinte saída em nosso console.

1
3
5
6
4
2

É essencialmente assim que Koa usa geradores. Ele nos permite criar um middleware compacto usando essa propriedade e escrever código para as funcionalidades upstream e downstream, poupando-nos assim de callbacks.