fetch : La fin de $.ajax()

Dans le lot d'améliorations et de nouveautés apportées par ES2015 il y a la méthode fetch. On va y consacrer cet article.

La méthode fetch est une nouvelle façon de faire des appels AJAX en Javascript. Vous pouvez vous dire que l'on peut faire de l'AJAX depuis bien longtemps en Javascript et que ça marche très bien.

Vous avez raison ! Mais le but de cette méthode est de simplifier le développement, d'améliorer les performances et l'expérience utilisateur.

Avant EcmaScript 2015

Les méthodes pour faire de l'AJAX avant ES2015 sont XMLHttpRequest, $.ajax et quelques autres méthodes customs similaires utilisant XMLHttpRequest en interne.

Prenons en exemple la récupération d'une simple page HTML, sans gestion d'erreur.

Avec XMLHttpRequest :

let req = new XMLHttpRequest()  
let res = ''  
req.open('GET', 'http://blog.nathanaelcherrier.com/', true)  
req.onreadystatechange = (e) => {  
  if (req.readyState === 4) {
     if(req.status === 200) {
      res = `Web page: ${req.responseText}`
     }
  }
}
req.send(null)  

Le même exemple avec jQuery :

let res = ''  
$.ajax('http://blog.nathanaelcherrier.com/')
.done((msg) => {
  res = `Web page: ${msg}`
})

jQuery, vaillant compagnon du développeur JS pendant des années, a beaucoup simplifié l'utilisation de l'AJAX.

Notre problème avec jQuery c'est qu'il prend de la place et quand une ressource prend de la place, elle prend aussi du temps à se charger, consomme de la data, etc... Bref, dans le monde du web front, soit mince ou soit indispensable.

fetch, le $.ajax natif

Le $.ajax est bien, il est la réponse de la communauté à des problématiques précises. Le XMLHttpRequest était complexe, verbeux et générait du code dupliqué.

$.ajax fait partie de la library jQuery. Et le but premier et unique de jQuery et de pallier aux faiblesses de Javascript pour le rendre plus simple et accessible (gestion de la rétro compatibilité, surcharge du langage, etc).

Lors de l'implémentation d'ES2015, Ecma International s'est appuyé sur ce qu'a fait la communauté pendant ces dernières années pour proposer des solutions natives. fetch en est l'exemple.

fetch fait des promesses

fetch respecte la norme des Promises. Elle en retourne une pour vous fournir le résultat attendu.

let result = ''  
fetch('http://blog.nathanaelcherrier.com/')  
  .then(res => res.text()) // on récupère le corps au format text. 
  .then(text => {
    result = `Web page: ${text}`
  })

Sous sa forme promesse, fetch ressemble beaucoup à $.ajax dans son utilisation. Je noterais quand même que le code est ici beaucoup plus formalisé, propre.

Dans des cas plus complexes de traitement des données reçues, on appréciera le formalisme de fetch. Et surtout sa simplicité.

fetch avec async/await

fetch ne vous a pas encore tout dit. Vous n'êtes pas obligé de l'utiliser avec des promesses.

Certains ne se sont toujours pas fait à l'asynchronicité de Javascript. Ecrire du code qui ne va pas forcément s'exécuter dans l'ordre où on l'a écrit peut être troublant pour beaucoup d'entre nous.

Grâce aux mots clés async et await, vous allez pouvoir écrire du code asynchrone comme s'il s'agissait de code synchrone à l'intérieur de votre fonction notée async.

async function getPage(url) {  
  let res = await fetch(url)
  let text = await res.text()
  return text
}

getPage('http://blog.nathanaelcherrier.com/').then(result => {  
  console.log(result)
})

Le mot clé await indique que je veux attendre le résultat du fetch avant de passer à l'instruction suivante.

La fonction getPage() étant notée comme asynchrone, elle retourne automatiquement une promise contenant votre valeur de retour.

Attention : les mots clés async et await ne font pas partie de la specification ES2015 mais de celle de ES2016

Pourquoi passer à fetch ?

J'ai envie de vous dire: "Pourquoi pas ?". C'est un peu juste comme conclusion ? Ok.

On a déjà évoqué l'intérêt d'avoir des solutions natives aux problèmes que nous rencontrons en front. Il en va des performances de notre application. Une solution aussi efficace en natif que celle apportée par une librairie tierce doit donc être privilégiée.

Pour rappel :

  • moins de temps de transfert (server -> client)
  • moins de temps d'exécution
  • simplicité d'utilisation similaire
  • pas de problème de mise à jour de dépendances

Et puis au-delà de ça, il faut toujours préférer apprendre le langage plutôt que les frameworks. Surtout dans un écosystème changeant comme Javascript en ce moment. Un framework ou une librairie aura toujours une durée de vie inférieure au langage sur lequel il est basé.

Avec des connaissances du langage vous pourrez toujours changer de librairie au besoin.

Je pousse clairement à l'apprentissage du pur JS, car je trouve que trop de gens connaissent jQuery sans connaitre Javascript. C'est désolant, mais on s'éloigne du sujet de cet article...


Tweetez moi si vous avez des questions ou des remarques. Et bien-sûr, n'hésitez pas à partager si vous avez aimé cet article.

Nathanaël Cherrier

Ingenieur de développement mobile et web pour Econocom. Passionné par le développement en général, mais plus particulièrement par le développement web et mobile, je vous raconte mes petits secrets.

Subscribe to Mindsers IT

Get the latest posts delivered right to your inbox.

or subscribe via RSS with Feedly!