Nodejs — Tornando uma função assíncrona em uma função síncrona
Olá Gente!
Funções síncronas são excelente ❤, porem, em muitos casos não temos esta opções.
Para este tutorial, iremos executar um “Ping” utilizando a função “child_process” no Nodejs.
A função “child_process” é uma função assíncrona que possui alguns manipuladores que indicam cada mensagem enviada, algum erro e a conclusão do comando.
No exemplo abaixo estamos fazendo um Ping para a Google:
No exemplo acima estamos executando o Ping e manipulando cada mensagem, erros e o final do comando.
Porem, esta função ocorre em paralelo a todas as outras já em execução.
Por exemplo, temos o código abaixo onde estamos fazendo um “console.log” antes e depois do Ping:
console.log(">> Antes do Ping <<");
[Ping Aqui]
console.log(">> Depois do Ping <<");
O resultado é:
Observe que os dois “console.log” são executados e só quando o ping termina que seu resultado é exibido.
Porem, imagine que precisamos do retorno do ping para executar a função seguinte, esta alternativa se tornaria inviável.
Para este caso, o ideal seria utilizar uma função sincronia, utilizando o async/await.
Mas como iremos transformar esta função em uma função assincrona?
Para isto iremos utilizar o “Promise”, que basicamente é uma “Promessa” de que algo ira ser retornado em algum momento.
O promise faz com que o que estiver dentro do promise possa enviar um “resolve” indicando que a função foi finalizada e o “reject” indiando um falha.
Vamos adaptar o Ping para uma função sincrona:
Veja que estamos criando um promise, e no manipulador “close” estamos enviando o “resolve” com tudo que o Ping retornou.
Agora basta chamarmos esta nova função com await:
const init = async function(){
console.log(">> Antes do Ping <<");
try {
const RetPing = await ping("google.com.br");
console.log(RetPing);
} catch(err) {
console.log(err);
}
console.log(">> Depois do Ping <<");
};
init();
Após isto, teremos o seguine retorno:
Veja que o segundo “console.log” só é chamado quando a função “ping” finalizar.
E assim terminamos, pessoal! 👩💼
Até a próxima! 👋