Sobes.tech
Middle

Como trabalha com JavaScript assíncrono?

sobes.tech IA

Resposta da IA

Trabalho com assíncrono em JavaScript usando callbacks, promessas e async/await.

Callbacks são funções passadas para outras funções como argumentos e que são executadas após a conclusão de uma operação. Podem levar a "infernos de callbacks" quando há aninhamento.

// Exemplo de callback
function fetchData(callback) {
  setTimeout(() => {
    callback("Dados recebidos");
  }, 1000);
}

fetchData((data) => {
  console.log(data); // Vai mostrar "Dados recebidos" após 1 segundo
});

As promessas são objetos que representam a conclusão ou falha de uma operação assíncrona. Facilitam o trabalho com código assíncrono, evitando aninhamentos profundos. Têm três estados: pending (pendente), fulfilled (cumprida), rejected (rejeitada).

// Exemplo de promessa
function fetchDataPromise() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve("Dados recebidos");
    }, 1000);
  });
}

fetchDataPromise()
  .then((data) => {
    console.log(data); // Vai mostrar "Dados recebidos" após 1 segundo
  })
  .catch((error) => {
    console.error("Erro:", error);
  });

Async/await é açúcar sintático sobre promessas que torna o código assíncrono mais legível, parecido com síncrono. Uma função marcada com async sempre retorna uma promessa. O operador await só pode ser usado dentro de funções async e pausa a execução até que a promessa seja resolvida ou rejeitada.

// Exemplo de async/await
async function fetchDataAsync() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve("Dados recebidos");
    }, 1000);
  });
}

async function processData() {
  try {
    const data = await fetchDataAsync();
    console.log(data); // Vai mostrar "Dados recebidos" após 1 segundo
  } catch (error) {
    console.error("Erro:", error);
  }
}

processData();

Frequentemente uso async/await ao trabalhar com requisições API, pois é a forma mais conveniente e legível de lidar com operações assíncronas. Para execução paralela de várias operações assíncronas, uso Promise.all() ou Promise.allSettled().

Utilizo o event loop para entender a ordem de execução do código assíncrono, microtarefas e macro-tarefas.