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:
var CmPing = spawn('ping', ["google.com.br"]);
var TmpOut = "";
CmPing.stdout.on('data', (data) => {
TmpOut += data.toString();
});
CmPing.stderr.on('data', (data) => {
console.log("error", data);
});
CmPing.on('close', (code) => {
if( code === 0 )
{
console.log("sucesso", TmpOut);
}else{
console.log("error", code);
}
});
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:
const ping = async function(Host){
return new Promise((resolve, reject) => {
var CmPing = spawn('ping', [Host]);
var TmpOut = "";
CmPing.stdout.on('data', (data) => {
TmpOut += data.toString();
});
CmPing.stderr.on('data', (data) => {
reject(data);
});
CmPing.on('close', (code) => {
if( code === 0 )
{
resolve(TmpOut);
}else{
reject(code);
}
});
});
};
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! 👋
Leia também
API Mágica: CEP e Pix de graça, sem cartão
Lancei a API Mágica: CEP, QR Code Pix, geradores e mais, de graça. Veja como consultar e gerar com Node.js em poucas linhas.
Resend: enviando e recebendo e-mails com Node.js
Tutorial da Resend com Node.js: criar a chave, enviar com fetch, verificar o domínio e receber e-mails por webhook conferindo a assinatura.
Node.js: testando scripts de scraping no ScrapingCourse
O ScrapingCourse é um site feito para treinar scraping. Cinco desafios dele em Node.js, e a armadilha real que cada um esconde.