Json
Json
Json
Cours 4
JSON
AJAX
Asynchronisme
Promesses
kn@lri.fr
Plan
3 / 34
Array (interface impérative)
new Array(n) : Initialise un tableau de taille n (indicé de 0 à n-1) où toutes les cases
valent undefined
.length : renvoie la longueur du tableau
.toString() : applique .toString() à chaque élément et renvoie la concaténation
.push(e) : ajoute un élément en �n de tableau
.pop() : retire et renvoie le dernier élément du tableau (unde�ned si vide)
.shift() : retire et renvoie le premier élément du tableau (unde�ned si vide)
.unshift(e) : ajoute un élément au défbut du tableau
.splice(i, n, e1, …, ek) : à partir de l'indice i, e�ace les éléments i à i+n-1 et insère
les éléments e1, …, ek
.sort(f) : trie le tableau en place suivant la fonction f, qui compare deux éléments et
doit renvoyer un nombre négatif, nul ou positif selon que le premier argument est
inférieur, égal ou supérieur au second. Si f est omise, alors les éléments sont
comparés selon leur valeur de chaînes de caractères.
4 / 34
Array (interface fonctionnelle)
5 / 34
A�ectation par deconstruction (tableaux)
let couleurs = [ "rouge", "bleu", "vert", "jaune", "violet" ];
∕∕avant;
let c_rouge = couleurs[0];
let c_bleu = couleurs[1];
let c_vert = couleurs[2];
∕∕ maintenant
let [ c_rouge, c_bleau, c_vert ] = couleurs;
∕∕ autres cases ignorées
6 / 34
Fonctions variadiques
En Javascript, on peut toujours appeller une fonction avec un nombre quelconque
d'arguments.
Si la fonction est dé�nie avec plus de paramètres, les paramètres manquant sont
initialisé à undefined
Si la fonction est dé�nie avec moins de paramètres, les arguments supplémentaires sont
ignorés
On peut dé�nir des fonctions variadiques:
function f (a, b, ...others) {∕∕ attentions, le ...
∕∕ fait partie de la syntaxe
console.log(others);
}
others est un tableau contenant les arguments en plus. Il ne peut y avoir qu'un seul
argument ...x qui doit être le dernier paramètre.
7 / 34
Boucles « for each »
On peut itérer sur une collection avec la construction for … of. Plusieurs objets de la
bibliothèque standard implémentent la méthode .entries() qui renvoie la collection des
entrées :
let tab = [ "A", "B", "C", "D" ];
8 / 34
Plan
Solutions actuelles
10 / 34
JSON : syntaxe
Une valeur JSON est représenté par un sous-ensemble de la syntaxe Javascript pour les
objets.
{ "nom" : "Nguyen",
"prénom" : "Kim",
"cours": [ "Javascript", "TER" ],
"full time" : true,
"age" : 3.6e1,
"hobby" : null }
11 / 34
JSON : syntaxe (suite)
12 / 34
API pour JSON
L'objet JSON disponible en Javascript possède deux méthodes :
13 / 34
JSON.parse (exemples)
JSON.parse("1");
> 1
JSON.parse("[ 1, 2, \"3\", false ]");
> [1, 2, "3", false]
JSON.parse("null"); "\a"
> null
var o = JSON.parse("{ \"a\" : 1 }");
> undefined
o.a;
> 1
JSON.parse("{ a : 1 }");
> erreur
JSON.parse("{ ");
> erreur
JSON.parse("undefined");
> erreur
14 / 34
JSON.stringify
Beaucoup de règles :
15 / 34
JSON.stringify (exemple)
class Point {
constructor(x, y) {
this.x = x;
this.y = y;
this.f = function () {};
}
move (i, j) {
this.x += i;
this.y += j;
}
}
let p = new Point(1,2);
JSON.stringify(p);
> "{\"x\":1,\"y\":2}"
Les propriétés du prototype n'ont pas été énumérées, celle de l'objet qui est une fonction
(f) a été ignorée
16 / 34
Avantages/Inconvénients de JSON par rapport à XML
Une fois parsée, la valeur JSON devient une valeur Javascript (utilisation directe des
propriétées)
Une valeur XML devient un objet DOM, dans lequel il faut naviguer avec
.getFirstChild(), .getElementById(), ...
Par contre JSON ne possède pas de notion de schéma bien établie (draft en cours) donc il
faut valider « à la main »
17 / 34
Plan
restaurer
AJAX : API permettant d'envoyer des requêtes HTTP à un serveur depuis Javascript de
manière asynchrone, en tâche de fond et de récupérer le résultat
19 / 34
XmlHttpRequest
Objet contenant les (nombreuses) méthodes permettant d'envoyer une requête GET ou
POST à un serveur distant :
20 / 34
Traîtement asynchrone de la réponse
On se connecte à l'évennement readystatechange de l'objet XmlHttpRequest. Exemple:
21 / 34
Avantage/Inconvénients
Avantages :
Inconvénient
◆ Sujet à la same origin policy (donc un script ne peut parler qu'au serveur qui l'a fourni),
sauf si le serveur accepte explicitement les connexions (il faut con�gurer le serveur Web
spécialement).
◆ Interface relativement bas-niveau
◆ Ne permet pas une communication temps réel
On peut demander un résultat d'un autre type que string (document HTML, objet JSON,
…)
22 / 34
Démo
On souhaite faire une boite de texte qui propose de la complétion à partir d'un
dictionaire en français.
On doit écrire une partie serveur et une partie client.
23 / 34
Plan
interval de temps
◆ Calculs parallèles : un ensemble de tâches qui s'exécutent au même moment
(physique)
25 / 34
Modèle d'exécution Javascript
Le moteur d'exécution Javascript est mono-thread. Il ne permet donc pas de calculs
parallèles. Si on e�ectue un calcul coûteux (en temps), la page se « �ge ». Les navigateurs
interdisent ce genre de comportements.
Deux implications sur le code Javascript :
1. Les calculs « lents » à cause de condition externes (requêtes réseaux, une attente
d'évènement utilisateur, …) sont e�ectués de manière asynchrone
2. Les calculs intrinsèquement « coûteux » doivent être « découpés » manuellement par
le programmeur.
26 / 34
Mots mis en formes
On veut modi�er l'exemple précédant du dictionnaire pour appeler, pour chaque mot
renvoyé, un deuxième service Web qui met ce mot en gras
27 / 34
Plan
}
}
}
}
29 / 34
Promesses
Problèmes du code asynchrone
30 / 34
Utilisation :
let p = new Promise(function (success, failure) {
31 / 34
Promesses
let step1 = function (value1) {
return new Promise(function(success, failure) {
∕∕faire ce qu'on faisait avant.
};
};
...
32 / 34
Promesses
let p = new Promise(…);
p.then(step1)
.then(step2)
.then(step3)
.then(step4)
.catch(function(e) {
console.log(e);
};
◆ Promise.all(tab) renvoie une promesse qui se termine quand toutes les promesses
du tableau tab sont terminées (et renvoie le tableau des valeurs)
◆ Promise.race(tab) renvoie une promesse qui se termine quand l'une des promesses
33 / 34
Support syntaxique, fonctions async
L'utilisation des promesses est encore simpli�ée par une syntaxe spéciale
async function longFun() {
∕∕ code qui prend du temps
return 4
}
Les fonction async ne renvoient pas directement leur résultat, mais une promesse qui le
calcule.
let x = longFun(); ∕∕x ne vaut pas 42!
x.then((res) => { console.log(res); });
Au sein d'une fonction async on peut utiliser le mot clé await pour « attendre » une
promesse :
async otherLongFun () {
let x = await longFun();
let y = await longFun();
let z = await longFun();
return x + y + z;
}
34 / 34