JavaScript


JSON, AJAX & promesses

Raconté par Vincent Jugé
sur la base d'un cours créé par Rémi Forax

JSON

Notation JSON

Sous-ensemble de la notation sur les objets et les tableaux JavaScript qui sert de format d'échange de données

Seuls les types primitifs sont supportés : boolean, number, string, array & object.
Les noms des propriétés apparaissent entre " " !

JSON.parse

La commande JSON.parse permet de décoder en JavaScript une chaîne de caractères comme un objet JSON.


Asynchronous Javascript And XML

AJAX ou AJAP ?

AJAX permet de faire, en JavaScript, des requêtes à un serveur en enregistrant une fonction qui sera exécutée plus tard, lorsque les données du serveur seront disponibles.

Le fait de reporter le traitement au moment où les données seront présentes est appelé traitement asynchrone.

Dans la réalité, on utilise plutôt JSON que XML comme format de transport, mais on garde le nom AJAX (au lieu de AJAP).

XML ou JSON ?

JSON est non structuré et non validable facilement donc il est utilisé pour les transferts de petites données (en ko).

XML est plus lourd mais structuré et validable, il est utilisé pour le transfert de données plus importantes (en Mo).

XMLHttpRequest(1/4)

Un objet XMLHttpRequest permet de faire une requête AJAX.


XMLHttpRequest (2/4)

open(method, url, async?) configure la requête.
send() envoie la requête.


XMLHttpRequest (3/4)

onreadystatechange est appelée lorsque cet état change.
readyState indique l'état de la requête.


XMLHttpRequest (4/4)

Si le readyState est 4 et que le status est 200,
on peut lire le responseText.


Promesse

Promesse

Une Promise est la promesse d'une valeur (ou erreur) à venir.


Promesse & AJAX à la main


Fetch

fetch()


fetch("http://api.foo.bar.com/users/bob")
.then(response => {
   if (response.ok) {
     return ...
   }
   throw Error(response.statusText);
 });

Attention, fetch renvoie une réponse même si la réponse est Not Found.

Fetch en vrai

fetch() fait une requête AJAX et renvoie une Promise.
response.json() est aussi une Promise qui va parser le JSON.


then() permet de combiner les promesses !

Fetch d'une image

URL.createObjectURL permet de créer une URL locale contenant les données de l'image.


blob = binary large object

Promise.all

Calcul de plusieurs promesses en parallèle :
le résultat est un tableau des promesses résolues.


Promise.all

Attention ! Si on enchaîne des appels à Promise.all(),
on peut créer des goulots d'étranglement.


Promise.all

Il est plus efficace de paralléliser au maximum !


Promise.race

La promesse résultante est calculée dès qu'une des promesses a fini.