Outils de la page


Lionel Médini

MIF38 - Université Claude Bernard Lyon 1

licence Creative Commons BY-NC-SA

  • Introduire la notion de promesse
  • Présenter leur utilité pour :
    • gérer du code asynchrone
    • lancer des processus en parallèle
    • les chaîner
  • Position du problème
  • Fonctionnement d'une promesse
  • Outils existants
  • Utilisation

Fonctions d'ordre supérieur

+

Programmation asynchrone

=

Source : http://callbackhell.com/

  • Programmer proprement
    • Nommer les fonctions
    • Modulariser
    • Gérer les erreurs
  • Utiliser des “raccourcis syntaxiques”
    • Promesses
    • Générateurs (ES6)

<note>“Promises provide a well-defined interface for interacting with an object that represents the result of an action that is performed asynchronously, and may or may not be finished at any given point in time.”</note>

Source : CommonJS

→ Approches différentes

→ Syntaxes différentes

La notion (et surtout la syntaxe) unifiées sont les résultats de plusieurs synthèses :

Une promesse permet de :

  • Lancer du code asynchrone ou différé (deferred)
    • requête AJAX, entrée utilisateur, calcul complexe…
  • Réagir spécifiquement
    • en cas de succès
    • en cas d'erreur
    • à la fin de l'exécution
  • En conservant des performances acceptables
    • multithread

…Tout en vous affranchissant de l'écriture du “boilerplate code”

Une promesse est dans l'un des états suivants :

  • Pending : état initial
  • Fulfilled : l'opération s'est terminée correctement
  • Rejected : l'opération s'est terminée avec une erreur
  • Settled : l'opération s'est terminée, peu importe comment

Création d'une promesse :

var p1 = new Promise(
    // The resolver function is called with the ability to resolve or reject the promise
    function(resolve, reject) {
      try {
        // ...
        if(touvabien) {
          // Fulfill the promise
          resolve(result);
        }  else {
          //Error
          reject(error);
        } catch(error) {
          reject(error);
        }
    });

Utilisation d'une promesse :

p1.then(function(result) {
  //If fulfilled
}).catch(function(error) {
  //If rejected
}).done(funciton() {
  //If settled
});

Syntaxe (PromiseJS) :

var promises = [];
promises.push(p1);
promises.push(p2);
...
Promise.all(p).done(function(result) {
  //Can use all results
}

Syntaxe (PromiseJS) :

var promises = [];
promises.push(p1);
promises.push(p2);
...
Promise.race(p).then(function(result) {
  //Can use all results
}