Programmation Javascript avancée§

1

Promesses§

2

Rappels sur la programmation asynchrone§

Au cours précédent, on a vu qu'en programmation asynchrone, il était fréquent de passer une fonction en paramètre d'une autre fonction, afin que la première soit appelée plus tard.

Exemple 1 :

b.addEventListener('click',
    (evt) => { console.log("Vous avez cliqué"); }
);

Exemple 2 :

setTimeout(
    () => { console.log("Une seconde s'est écoulée"); }
, 1000);

Exemple 3 :

fetch("http://example.org/").then(
    (resp) => { console.log("Le serveur a répondu"); }
).catch(
    (err) => { console.log("Le serveur ne répond pas"); }
);
3

Callback§

Historiquement, la fonction a appeler plus tard est passée directement en paramètre de la fonction appelante (exemples 1 et 2 ci-avant). On appelle la fonction passée en paramètre un callback.

Parfois, une fonction requiert deux callbacks :

Les fonctions plus récentes n'attendent pas de callback en paramètre, mais retournent un objet Promesse.

4

Promesse§

5

Avantage : lisibilité accrue§

6

Avantage : lisibilité accrue§

7

Avantage : lisibilité accrue§

Indice

Attention de ne pas oublier le return à la fin de chaque callback passé à then, sans quoi il retournera null, et le then suivant s'exécutera immédiatement.

8

Avantage : lisibilité accrue§

9

Avantage : combinaison de promesses§

Attendre que toutes les promesses d'un tableau aient abouti :

Promise.all(
  [fetch(url1), fetch(url2), fetch(url3)]
).then(
  (responses) => { console.log("toutes les URLs ont répondu"); }
).catch(
  (err) => { console.log("une erreur s'est produite", err); }
)

Attendre qu'au moins une des promesses d'un tableau ait abouti :

Promise.race(
  [fetch(url1), fetch(url2), fetch(url3)]
).then(
  (response) => { console.log("une des URL a répondu")}
)
10

Programmation orientée-objet§

11

Méthodes d'objet§

12

Le mot-clé this§

En Javascript, lorsqu'on accède à une fonction via un objet, le mot-clé this dénote cet objet :

let v = {
  x: 3.0,
  y: 4.0,
  length: function() {
    return Math.hypot(this.x, this.y);
  }
}
v.length(); // retourne 5

Note

Les fonctions "flêches" font exception à cette règle, c'est pourquoi on utilise le mot-clé function ici.

13

Méthodes ES6§

En ES6, on peut également utiliser la syntaxe raccourcie suivante :

let v = {
  x: 3.0,
  y: 4.0,
  length() {
    return Math.hypot(this.x, this.y);
  }
}
v.length(); // retourne 5
14

Classes ES6§

En ES6, il est possible de définir une classe, pour créer plusieurs objets ayant la même structure et les mêmes méthodes.

class Vector {
  constructor(x, y) {
    this.x = x;
    this.y = y;
  }

  length() {
    return Math.hypot(this.x, this.y);
  }
}

let v = new Vector(3, 4);
v.length(); // retourne 5

Note

constructor est une méthode particulière, appelée lorsqu'on utilise l'opérateur new.

15

Attributs contrôlés par des méthodes§

Dans l'exemple précédent, on pourrait souhaiter utiliser length comme un attribut (en lecture seule) plutôt que comme une méthode (i.e. sans les parenthèses).

Ceci est possible en définissant un accesseur (getter en anglais) :

class Vector {
  constructor(x, y) {
    this.x = x;
    this.y = y;
  }

  get length() {
    return Math.hypot(this.x, this.y);
  }
}

let v = new Vector(3, 4);
v.length; // retourne 5
16