cefet_front_end

JavaScript parte 7

Ajax


Hoje veremos

  1. Requisições síncronas
  2. Ajax: requisições assíncronas
    • Em vanilla JavaScript
    • Com ajuda de jQuery
    • Usando fetch

Requisições Síncronas

Como funcionam as requisições


Relembrando, o protocolo HTTP

Requisição:

  GET /index.html HTTP/1.1
  Host: www.twitter.com
  1. Resposta:
    HTTP/1.1 200 OK
    Date: Mon, 23 May 2005 22:38:34 GMT
    Server: Apache/1.3.3.7 (Unix) (Red-Hat/Linux)
    Content-Type: text/html; charset=UTF-8
    Content-Length: 131
    
    <!DOCTYPE html>
    <html>
    <head>
      <title>Twitter</title>
    </head>
    <body>
      Olá mundo, este é um tweet.
    </body>
    </html>
    

Síncrono vs assíncrono

Páginas dinâmicas Páginas dinâmicas Páginas dinâmicas Páginas dinâmicas Páginas dinâmicas Páginas dinâmicas Páginas dinâmicas Páginas dinâmicas Páginas dinâmicas Páginas dinâmicas


:globe_with_meridians: Exemplo do Fumaceiro


Ajax

Requisições assíncronas

Foto do personagem Deadpool enfrentando um limpador multiuso AJAX

  1. Exemplo antigão (XMLHttpRequest)
  2. Exemplo com jQuery
  3. Exemplo com fetch

Ajax


(1) O XMLHttpRequest (antigão)


function callbackMaisTweets() {
  if (requisicao.readyState === 4) {  // 4: DONE (resp. recebida)
    if (requisicao.status === 200) {  // 200: código Ok do HTTP
      // a resposta chegou e foi um arquivo
      // .json com um array de tweets:
      let novosTweets = requisicao.response.arrayComNovosTweets;
      novosTweets.forEach(colocaTweetNaPagina);
    } else {
      console.log('Erro ao carregar mais tweets. Código HTTP: '
        + requisicao.status);
    }
  }
}


Estados de um XMLHttpRequest

0 UNSENT .. open() ainda não foi invocado

1 OPENED .. send() ainda não foi invocado

2 HEADERS_RECEIVED .. send() foi invocado e os cabeçalhos da resposta já estão disponíveis (chegaram)

3 LOADING .. fazendo download da resposta

4 DONE .. operação finalizada


Exemplo do Fumaceiro (versão vanilla js)


// no clique, faz um Ajax para pegar o xcom-reviews.json
showReviewsEl.addEventListener('click', () => {
  let requisicao = new XMLHttpRequest();
  requisicao.open('GET', 'xcom-reviews.json');
  requisicao.responseType = 'json';
  requisicao.onreadystatechange = () => {
    // chegando a resposta, põe as avaliações na página
    if (requisicao.readyState === 4) {
      if (requisicao.status === 200) {
        // a resposta é um objeto js que tem 'avaliacoes'
        let avaliacoes = requisicao.response.avaliacoes;

        reviewsEl.innerHTML = '';
        avaliacoes.forEach(criaAvaliacaoNaPagina);
      }
    }
  }

  requisicao.send();
});

{
  "avaliacoes": [
    {
      "autor": "Astolfo Lombardi",
      "recomenda": true,
      "comentario": "Um jogo de ETs sinistrões",
      "curtidas": 18
    },
    {
      "autor": "Eymael Fortunato",
      "recomenda": true,
      "comentario": "Rola uma parada sadia entre
                     humanos e aliens neste jogo #sqn",
      "curtidas": 7
    } /* ...+2 avaliações */
  ]
}

(2) Ajax mais facinho com jQuery


Exemplo do Fumaceiro (versão jQuery)

$('#show-reviews').click(() => {
  $.ajax({
    url: 'xcom-reviews.json',
    dataType: 'json',
    success: resposta => {
      // a resposta é um objeto js que contém uma propriedade avaliacoes
      let avaliacoes = resposta.avaliacoes;
      // limpamos a <div id="reviews">...</div>
      $reviews.empty();
      // percorremos as avaliacoes, colocando elementos na página
      avaliacoes.forEach(criaAvaliacaoNaPagina);
    }
  });
});

(3) Ajax usando fetch


Exemplo do Fumaceiro (versão fetch)

showReviewsEl.addEventListener('click', () => {
  fetch('xcom-reviews.json')                        // retorna uma *promessa*
    .then(respostaBruta => respostaBruta.json())    // arrow function
    .then(resposta => {
      // a resposta é um objeto js que contém uma propriedade avaliacoes
      let avaliacoes = resposta.avaliacoes;

      reviewsEl.innerHTML = '';
      avaliacoes.forEach(criaAvaliacaoNaPagina);      
    });
  });
});

Usos comuns de Ajax


Erro ao fazer o AJAX


Referências

  1. Mozilla Developer Network (MDN)
  2. Artigo que batizou a técnica de Ajax, de Jesse James Garret