Executando verificação de segurança...
1

Como fazer chamadas assíncronas a APIs de forma eficiente com JavaScript?

Olá, desenvolvedores!

Estou precisando da ajuda de vocês para encontrar a melhor forma de realizar múltiplas chamadas a uma API de maneira eficiente e performática utilizando JavaScript.

O problema

Preciso lidar com duas etapas principais:

  • Fazer uma chamada para uma API que retorna uma lista de raças de gatos.
  • Com essa lista em mãos, chamar outra API utilizando o ID de cada raça para obter os detalhes específicos (como origem, nível de energia, se são amigáveis, etc.).

A dúvida

Para isso, criei o código abaixo, que realiza as chamadas de forma assíncrona, iterando sobre os IDs (vindos no primeiro passo).

Quero saber: existe uma abordagem mais performática ou uma técnica mais eficiente para resolver esse problema usando JavaScript?

Importante: Fiz um código simples e adicionei alguns comentários para facilitar o entendimento. O foco da minha dúvida está no método getCatDetails(cats).

// Função para buscar uma lista de raças de gatos
async function getCats() {
  const URL =
    "https://api.thecatapi.com/v1/images/search?has_breeds=1&order=rand&limit=10";

  const headers = new Headers({
    "Content-Type": "application/json",
  });

  const requestOptions = {
    method: "GET",
    headers: headers,
    redirect: "follow",
  };

  try {
    const response = await fetch(URL, requestOptions);
    return await response.json();
  } catch (err) {
    console.error(`Aconteceu um erro não esperado. Detalhes: ${err}`);
  }
}

// Função para buscar os detalhes de cada raça de gato
async function getCatDetails(cats) {
  const headers = new Headers({
    "Content-Type": "application/json",
  });

  const requestOptions = {
    method: "GET",
    headers: headers,
    redirect: "follow",
  };

  // Monta a lista de URLs para obter os detalhes de cada gato
  const urls = cats.map((cat) => `https://api.thecatapi.com/v1/images/${cat.id}`);

  // Faz as chamadas assíncronas usando Promise.all
  try {
    const catDetails = await Promise.all(
      urls.map(async (url) => {
        const response = await fetch(url, requestOptions);
        return await response.json();
      })
    );
    return catDetails;
  } catch (err) {
    console.error(`Aconteceu um erro não esperado. Detalhes: ${err}`);
  }
}

// Função principal para executar o processo
(async () => {
  // Obtém uma lista aleatória de 10 raças de gatos
  const cats = await getCats();
  
    if (cats.length === 0) {
    console.error("Não foi possível obter a lista de gatos.");
    return;
  }

  // Busca os detalhes de cada raça de gato
  const catDetails = await getCatDetails(cats);

  console.log(catDetails);
})();
Carregando publicação patrocinada...