Neste tutorial, vamos aprender sobre Geradores e suas diferenças com Callbacks
O que são geradores?
Os geradores se tornaram bastante famosos no Node.js nos últimos tempos, provavelmente por causa do que eles são capazes de fazer.
- Geradores são execuções de funções que podem ser suspensas e retomadas posteriormente.
- Os geradores são úteis ao realizar conceitos como 'execução preguiçosa'. Basicamente, isso significa que, ao suspender a execução e retomar à vontade, podemos extrair valores apenas quando necessário.
Os geradores têm os 2 métodos principais abaixo
- Método de rendimento - o método de rendimento é chamado em uma função para interromper a execução da função na linha específica onde o método de rendimento é chamado.
- Próximo método - Este método é chamado a partir do aplicativo principal para retomar a execução de uma função que possui um método de rendimento. A execução da função continuará até o próximo método de rendimento ou até o final do método.
Vejamos um exemplo de como os geradores podem ser usados.
Em nosso exemplo, teremos uma função Add simples que adicionará 2 números, mas continuaremos interrompendo a execução do método em diferentes pontos para mostrar como os geradores podem ser usados.
function* Add(x) {yield x + 1;var y = yield(null);y = 6return x + y;}var gen = Add(5);gen.next();gen.next();
Explicação do código: -
- O primeiro passo é definir nossa "função" do gerador. Observe que isso é feito adicionando um "*" à palavra-chave da função. Estamos, então, definindo uma função chamada Add que tem um parâmetro de x.
- A palavra-chave yield é específica para geradores. Isso o torna uma construção poderosa para pausar uma função no meio de qualquer coisa. Portanto, aqui, a execução da função será interrompida até que invoquemos a função next (), o que será feito na Etapa 4. Neste ponto, o valor de x se tornará 6 e a execução da função será interrompida.
- É aqui que chamamos pela primeira vez a função do gerador e enviamos o valor 5 para a nossa função Adicionar. Este valor será substituído no parâmetro x de nossa função Add.
- Assim que chamarmos a função next (), a função Add () retomará a execução. Quando a próxima instrução var y = yield (null) for executada, a função Add () irá parar novamente a execução.
- Agora, depois de chamar a função next () novamente, as próximas instruções serão executadas e o valor combinado de x = 5 ey = 6 será adicionado e retornado.
Callbacks vs. geradores
Os geradores são usados para resolver o problema do que é conhecido como inferno de retorno de chamada. Às vezes, as funções de retorno de chamada ficam tão aninhadas durante o desenvolvimento de um aplicativo Node.js que se torna muito complicado usar funções de retorno de chamada.
É aqui que os geradores são úteis. Um dos exemplos mais comuns disso é ao criar funções de temporizador.
Vejamos o exemplo abaixo de como os geradores podem ser úteis em relação aos retornos de chamada.
Nosso exemplo criará apenas uma função de atraso de tempo simples. Gostaríamos então de chamar esta função incorporando um atraso de 1000, 2000 e 3000 ms.
Etapa 1) Defina nossa função de retorno de chamada com o código de atraso de tempo necessário.
function Timedelay(ptime, callback) {setTimeout(function() {callback("Pausing for " + ptime);}, time);}
Explicação do código: -
- Aqui estamos criando uma função chamada Timedelay com um parâmetro chamado ptime. Isso levará o tempo necessário que queremos introduzir em nosso aplicativo.
- A próxima etapa é apenas criar uma mensagem, que será exibida ao usuário dizendo que o aplicativo ficará em pausa por muitos milissegundos.
Etapa 2) Agora, vamos examinar o código se estivéssemos incorporando retornos de chamada. Suponha que desejamos incorporar retornos de chamada com base no valor de 1000, 2000 e 3000 milissegundos, o código a seguir mostra como precisaríamos implementá-los usando retornos de chamada.
Timedelay(1000, function(message) {console.log(msg);Timedelay(2000, function(message) {console.log(msg);Timedelay(3000, function(message) {console.log(msg);})})})
Explicação do código: -
- Estamos chamando o Timedelay como um retorno de chamada com 1000 como o valor.
- Em seguida, queremos chamar a função Timedelay novamente com 2000 como o valor.
- Finalmente, queremos chamar a função Timedelay novamente com 3000 como o valor.
A partir do código acima, você pode ver que fica mais confuso, pois queremos começar a chamar a função várias vezes.
Etapa 3) Agora vamos ver como implementar o mesmo código usando geradores. A partir do código abaixo, você pode ver como se tornou simples implementar a função Timedelay usando geradores.
function* Messages() {console,log(yield(Timedelay(1000, function(){})));console,log(yield(Timedelay(2000, function(){})));console,log(yield(Timedelay(3000, function(){})));}
Explicação do código: -
- Estamos primeiro definindo uma função geradora que será usada para chamar nossa função Timedelay.
- Estamos chamando a função Yield junto com a função Timedelay com 1000 como o valor do parâmetro.
- Em seguida, estamos chamando a função Yield junto com a função Timedelay com 2000 como o valor do parâmetro.
- Finalmente, estamos chamando a função Yield junto com a função Timedelay com 3000 como o valor do parâmetro.
Resumo
Os geradores também podem ser usados para aliviar os problemas com retornos de chamada aninhados e ajudar na remoção do que é conhecido como inferno de retorno de chamada. Os geradores são usados para interromper o processamento de uma função. Isso é realizado pelo uso do método 'yield' na função assíncrona.