Criando um loading spinner para requisições assíncronas em JavaScript

Descubra como criar e usar um loading spinner para indicar ao usuário que uma requisição assíncrona está sendo processada, melhorando a UX da sua página.

Como criar um loading spinner enquanto uma requisição assíncrona é processada?

Ao trabalhar com requisições assíncronas em JavaScript, como chamadas a APIs, é fundamental melhorar a experiência do usuário, informando-o de que a operação está em andamento. Uma maneira simples e eficaz de fazer isso é usando um loading spinner, que é um ícone de carregamento exibido enquanto o processo assíncrono está sendo concluído.

Esse tipo de recurso visual é uma das melhores práticas para páginas que realizam operações demoradas, como o envio de dados a um servidor ou a recuperação de informações de uma API.

Como criar um loading spinner?

Para criar um loading spinner simples, você pode usar apenas HTML, CSS e JavaScript. O spinner será exibido enquanto a requisição assíncrona está sendo processada e será ocultado quando a requisição for concluída.

Aqui está um exemplo básico de como criar um loading spinner com CSS e exibi-lo enquanto uma requisição assíncrona é processada:

HTML + CSS

<!DOCTYPE html>
<html lang="pt-BR">
<head>
  <meta charset="UTF-8">
  <title>Exemplo de Loading Spinner</title>
  <style>
    /* Estilo do spinner */
    .spinner {
      border: 16px solid #f3f3f3;
      border-top: 16px solid #3498db;
      border-radius: 50%;
      width: 120px;
      height: 120px;
      animation: spin 2s linear infinite;
      position: absolute;
      top: 50%;
      left: 50%;
      transform: translate(-50%, -50%);
      display: none;
    }

    @keyframes spin {
      0% { transform: rotate(0deg); }
      100% { transform: rotate(360deg); }
    }
  </style>
</head>
<body>

  <!-- Spinner -->
  <div id="spinner" class="spinner"></div>

  <button onclick="fazerRequisicao()">Fazer requisição</button>

  <script src="script.js"></script>
</body>
</html>

O que o código está fazendo: Este código HTML cria um spinner simples usando CSS. O spinner é inicialmente ocultado com display: none; e será exibido quando a requisição assíncrona for iniciada.

JavaScript

Agora, vamos adicionar a funcionalidade de exibir o spinner durante a execução de uma requisição assíncrona:

function fazerRequisicao() {
  // Mostrar o spinner
  document.getElementById('spinner').style.display = 'block';

  // Simular uma requisição assíncrona (exemplo com setTimeout)
  setTimeout(() => {
    // Ocultar o spinner após a requisição ser concluída
    document.getElementById('spinner').style.display = 'none';
    alert('Requisição concluída!');
  }, 3000);  // Simulando 3 segundos de delay
}

O que o código está fazendo: Quando o usuário clica no botão "Fazer requisição", a função fazerRequisicao() é chamada. A primeira ação da função é mostrar o spinner, alterando o display do elemento spinner para block. Em seguida, simulamos uma requisição assíncrona com setTimeout, que aguarda 3 segundos (simulando o tempo de uma requisição). Após esse tempo, o spinner é ocultado novamente e um alerta é exibido, indicando que a requisição foi concluída.

Usando um spinner com fetch para requisição real

Em vez de usar o setTimeout para simular uma requisição, você pode usar o fetch para fazer uma requisição HTTP real. O funcionamento seria o mesmo, mas o tempo de resposta dependeria do servidor e da rede.

Exemplo de como usar fetch com spinner:

function fazerRequisicao() {
  // Mostrar o spinner
  document.getElementById('spinner').style.display = 'block';

  // Fazer uma requisição real usando fetch
  fetch('https://jsonplaceholder.typicode.com/posts')
    .then(response => response.json())
    .then(data => {
      // Ocultar o spinner após a requisição ser concluída
      document.getElementById('spinner').style.display = 'none';
      console.log(data);  // Exibe os dados da requisição no console
    })
    .catch(error => {
      document.getElementById('spinner').style.display = 'none';
      console.error('Erro na requisição:', error);
    });
}

O que o código está fazendo: Agora, estamos fazendo uma requisição real usando o fetch para obter posts de um endpoint de exemplo (jsonplaceholder). Enquanto a requisição está sendo feita, o spinner é exibido, e após a conclusão da requisição (com sucesso ou erro), o spinner é ocultado.

Considerações finais

Usar um spinner de carregamento é uma técnica simples e eficaz para melhorar a experiência do usuário enquanto espera que uma requisição assíncrona seja concluída. Ao usar a abordagem descrita aqui, você pode facilmente controlar a visibilidade do spinner com base no estado da sua requisição assíncrona.

Não se esqueça de utilizar o CSS para personalizar o spinner e garantir que ele seja visível e intuitivo para os usuários.

Um loading spinner é uma maneira eficaz de indicar ao usuário que a página está carregando ou que uma operação está em andamento. Essa técnica ajuda a melhorar a experiência do usuário, evitando que ele fique confuso ou sem saber o que está acontecendo enquanto espera por uma resposta da aplicação.

Algumas aplicações:

  • Exibir spinners enquanto aguarda o carregamento de dados de uma API ou servidor.
  • Usar spinners em sites e aplicativos para melhorar a percepção de desempenho durante requisições demoradas.
  • Implementar uma interface interativa e informativa que comunica ao usuário que o sistema está processando suas ações.

Dicas para quem está começando

  • Comece com spinners simples em CSS, e depois explore bibliotecas de animação para criar spinners mais sofisticados.
  • Não se esqueça de ocultar o spinner assim que a requisição for concluída para evitar confundir o usuário.
  • Certifique-se de que o spinner tenha uma boa visibilidade, sem bloquear outras interações da página.
  • Experimente usar o fetch em vez de setTimeout para requisições reais em suas páginas web.

Contribuições de Andressa Maria

Compartilhe este tutorial: Como criar um loading spinner enquanto uma requisição assíncrona é processada?

Compartilhe este tutorial

Continue aprendendo:

Como detectar quando todas as imagens de uma página foram carregadas?

Descubra como detectar se todas as imagens de uma página foram carregadas em JavaScript e garantir que a interação do usuário aconteça apenas depois que tudo estiver pronto.

Tutorial anterior

Como debugar código assíncrono no navegador?

Descubra as melhores técnicas e ferramentas para debugar código assíncrono no navegador e solucionar problemas de forma eficiente em JavaScript.

Próximo tutorial