Nodejs — Tornando uma função assíncrona em uma função síncrona

Executando Ping no Node.js utilizando o child_process

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! 👋