Please note, this is a STATIC archive of website developer.mozilla.org from 03 Nov 2016, cach3.com does not collect or store any user information, there is no "phishing" involved.

Revision 1102639 of Promise

  • Raccourci de la révision : Web/JavaScript/Reference/Objets_globaux/Promise
  • Titre de la révision : Promise
  • ID de la révision : 1102639
  • Créé :
  • Créateur : SphinxKnight
  • Version actuelle ? Non
  • Commentaire touch review en-US

Contenu de la révision

{{JSRef}}

L'objet Promise (pour « promesse ») est utilisé pour réaliser des traitements de façon asynchrone. Une promesse représente une opération qui n'a pas encore été complétée, mais qui est attendue dans le futur.

Syntaxe

new Promise( /* exécuteur */ function(resolve, reject) { ... } );

Paramètres

exécuteur
Un objet fonction qui prend deux arguments : resolve et reject. Cette fonction est exécutée immédiatement par l'implémentation de Promise qui fournit les fonctions resolve et reject (elle est exécutée avant que le constructeur Promise ait renvoyé l'objet créé). Les fonctions resolve et reject sont liées à la promesse et appeler l'une ou l'autre change respectivement l'état de la promesse en tenue si tout c'est bien passé ou en rompue si une erreur à eu lieu. On attend de l'exécuteur qu'il démarre un travail asynchrone puis, une fois le travail terminé, appelle la fonction resolve ou la fonction reject pour définir l'état final de la promesse.

Description

L'interface Promise représente un intermédiaire (proxy) vers une valeur qui n'est pas nécessairement connue au moment de sa création. Cela permet d'associer des gestionnaires au succès éventuel d'une action asynchrone et à la raison d'une erreur. Ainsi, des méthodes asynchrones renvoient des valeurs comme les méthodes synchrones, la seule différence est que la valeur retournée par la méthode asynchrone est une promesse (d'avoir une valeur plus tard).

Une Promise est dans un de ces états :

  • pending (en attente) : état initial, la promesse n'est ni remplie, ni rompue ;
  • fulfilled (tenue) : l'opération a réussi ;
  • rejected (rompue) : l'opération a échoué ;
  • settled (acquitée) : la promesse est tenue ou rompue mais elle n'est plus en attente.

Une promesse en attente peut être tenue avec une valeur ou rompue avec une raison (erreur). Quand on arrive à l'une des deux situations, les gestionnaires associés lors de l'appel de la méthode then sont alors appelés. (Si la promesse a déjà été tenue ou rompue lorsque le gestionnaire est attaché à la promesse, le gestionnaire est appelé. Cela permet qu'il n'y ait pas de situation de compétition entre une opération asynchrone en cours et les gestionnaires ajoutés).

Les méthodes {{jsxref("Promise.then","Promise.prototype.then()")}} et {{jsxref("Promise.catch","Promise.prototype.catch()")}} renvoient des promesses et peuvent ainsi être chaînées. C'est ce qu'on appelle une composition.

Note: Une promesse est dans l'état settled (acquittée) qu'elle soit tenue ou rompue mais plus en attente. Le terme resolved (résolue) est aussi utilisé concernant les promesses — cela signifie que la promesse est acquittée ou bien enfermée dans une chaine de promesse. Le billet de Domenic Denicola, States and fates (en anglais), contient de plus amples détails sur la terminologie utilisée.

Attention : D'autres langages utilisent des mécanismes d'évaluation à la volée (lazy evaluation) et de déport des calculs (deferring computations). Ces mécanismes sont également intitulés promesses (promises). En JavaScript, les promesses correspondent à des processus déjà lancés et qui peuvent être chaînés avec des fonctions de retour. Si vous cherchez à retarder l'évaluation, vous pouvez utiliser les fonctions fléchées sans arguments (ex. f = () => expression) afin de créer une expression à évaluer plus tard et utiliser f() pour l'évaluer au moment voulu.

Propriétés

Promise.length
Une propriété de longueur qui vaut 1 (le nombre d'arguments pour le constructeur).
{{jsxref("Promise.prototype")}}
Cette propriété représente le prototype du constructeur Promise.

Méthodes

{{jsxref("Promise.all", "Promise.all(itérable)")}}
Renvoie une promesse tenue lorsque toutes les promesses de l'argument itérable sont tenues ou bien une promesse rompue dès qu'une promesse de l'argument itérable est rompue. Si la promesse est tenue, elle est résolue avec un tableau contenant les valeurs de résolution des différentes promesses contenues dans l'itérable (dans le même ordre que celui-ci). Si la promesse est rompue, elle contient la raison de la rupture de la part de la promesse en cause, contenue dans l'itérable. Cette méthode est utile pour agréger les résultats de plusieurs promesses tous ensemble.
{{jsxref("Promise.race", "Promise.race(itérable)")}}
Renvoie une promesse qui est tenue ou rompue dès que l'une des promesses de l'itérable est tenue ou rompue avec la valeur ou la raison correspondante.
{{jsxref("Promise.reject", "Promise.reject(raison)")}}
Renvoie un objet Promise qui est rompue avec la raison donnée.
{{jsxref("Promise.resolve", "Promise.resolve(valeur)")}}
Renvoie un objet Promise qui est tenue (résolue) avec la valeur donnée. Si la valeur possède une méthode then, la promesse renvoyée « suivra » cette méthode pour arriver dans son état, sinon la promesse renvoyée sera tenue avec la valeur fournie. Généralement, quand on veut savoir si une valeur est une promesse, on utilisera {{jsxref("Promise.resolve","Promise.resolve(valeur)")}} et on travaillera avec la valeur de retour en tant que promesse.

Promise prototype

Propriétés

{{page('fr/docs/Web/JavaScript/Reference/Objets_globaux/Promise/prototype','Propriétés')}}

Méthodes

{{page('fr/docs/Web/JavaScript/Reference/Objets_globaux/Promise/prototype','Méthodes')}}

Exemples

Créer un objet Promise

Dans le court exemple qui suit, on illustre le mécanisme d'une Promise. La méthode testPromise() est appelée chaque fois qu'on clique sur l'élément {{HTMLElement("button")}}. Cette méthode crée une promesse qui sera tenue grâce à la fonction {{domxref("window.setTimeout()")}}, et avec la valeur comptePromesse (nombre commançant à 1) après 1s à 3s (aléatoire). Le constructeur Promise() est utilisé pour créer la promesse.

Le fait que la promesse soit tenue est simplement enregistré via un callback sur p1.then(). Quelques indicateurs illustrent la manière dont la partie synchrone est découplée de la partie asynchrone.

'use strict';
var comptePromesse = 0;

function testPromise() {
  var thisComptePromesse = ++comptePromesse;

  var log = document.getElementById('log');
  log.insertAdjacentHTML('beforeend', thisComptePromesse + 
      ') Started (<small>Début du code synchrone</small>)<br/>');

  // on crée une nouvelle promesse :
  var p1 = new Promise(
    // La fonction de résolution est appelée avec la capacité de 
    // tenir ou de rompre la promesse
    function(resolve, reject) {       
      log.insertAdjacentHTML('beforeend', thisComptePromesse + 
          ') Promise started (<small>Début du code asynchrone</small>)<br/>');

      // Voici un exemple simple pour créer un code asynchrone
      window.setTimeout(
        function() {
          // On tient la promesse !
          resolve(thisComptePromesse);
        }, Math.random() * 2000 + 1000);
    });

  // On définit ce qui se passe quand la promesse est tenue
  // et ce qu'on appelle (uniquement) dans ce cas
  // La méthode catch() définit le traitement à effectuer
  // quand la promesse est rompue.
  p1.then(
    // On affiche un message avec la valeur
    function(val) {
      log.insertAdjacentHTML('beforeend', val +
          ') Promise fulfilled (<small>Fin du code asynchrone</small>)<br/>');
    }).catch(
      // Promesse rejetée
      function() { 
        console.log("promesse rompue");
      });

  log.insertAdjacentHTML('beforeend', thisComptePromesse + 
      ') Promise made (<small>Fin du code synchrone</small>)<br/>');
}

L'exemple s'exécute lorsqu'on clique sur le bouton. Pour tester cet exemple, il est nécessaire d'utiliser un navigateur qui supporte les objets Promise. En cliquant plusieurs fois sur le bouton en peu de temps, on verra qu'il y a plusieurs promesses tenues les une après les autres.

{{EmbedLiveSample('Créer_un_objet_Promise', '500', '200')}}

Utiliser XMLHttpRequest() avec une promesse

Dans l'exemple qui suit, on illustre comment utiliser une promesse pour fournir le résultat d'une requête {{domxref("XMLHttpRequest")}} :

'use strict';

// A-> $http cette fonction est implémentée pour respecter le patron
// de conception (pattern) Adaptateur
function $http(url){
 
  // Un exemple d'objet
  var core = {

    // La méthode qui effectue la requête AJAX
    ajax : function (method, url, args) {

      // On établit une promesse en retour
      var promise = new Promise( function (resolve, reject) {

        // On instancie un XMLHttpRequest
        var client = new XMLHttpRequest();
        var uri = url;

        if (args && (method === 'POST' || method === 'PUT')) {
          uri += '?';
          var argcount = 0;
          for (var key in args) {
            if (args.hasOwnProperty(key)) {
              if (argcount++) {
                uri += '&';
              }
              uri += encodeURIComponent(key) + '=' + encodeURIComponent(args[key]);
            }
          }
        }

        client.open(method, uri);
        client.send();

        client.onload = function () {
          if (this.status >= 200 && this.status < 300) {
            // On utilise la fonction "resolve" lorsque this.status vaut 2xx
            resolve(this.response);
          } else {
            // On utilise la fonction "reject" lorsque this.status est différent de 2xx
            reject(this.statusText);
          }
        };
        client.onerror = function () {
          reject(this.statusText);
        };
      });

      // Return the promise
      return promise;
    }
  };

  // Pattern adaptateur
  return {
    'get' : function(args) {
      return core.ajax('GET', url, args);
    },
    'post' : function(args) {
      return core.ajax('POST', url, args);
    },
    'put' : function(args) {
      return core.ajax('PUT', url, args);
    },
    'delete' : function(args) {
      return core.ajax('DELETE', url, args);
    }
  };
};
// Fin de A

// B-> Ici on définit les fonctions et les charges utiles
var mdnAPI = 'https://developer.mozilla.org/en-US/search.json';
var payload = {
  'topic' : 'js',
  'q'     : 'Promise'
};

var callback = {
  success : function(data){
     console.log(1, 'success', JSON.parse(data));
  },
  error : function(data){
     console.log(2, 'error', JSON.parse(data));
  }
};
// End B

// On exécute la méthode
$http(mdnAPI)
  .get(payload)
  .then(callback.success)
  .catch(callback.error);

// Une alternative qui appelle la méthode et permet de gérer le rejet de la promesse différemment
$http(mdnAPI) 
  .get(payload) 
  .then(callback.success, callback.error);

// Une autre alternative pour la gestion du rejet de la promesse
$http(mdnAPI) 
  .get(payload) 
  .then(callback.success)
  .then(undefined, callback.error);

Charger une image en XHR

Un autre exemple simple utilisant Promise et XMLHttpRequest afin de charger une image est disponible sur le dépôt GitHub MDN promise-test. Vous pouvez également consulter le résultat obtenu sur cette page. Chaque étape est commentée afin de vous permettre de suivre l'état de la promesse et l'architecture utilisée avec XHR.

Spécifications

Spécification État Commentaires
{{SpecName('ES6', '#sec-promise-objects', 'Promise')}} {{Spec2('ES6')}} Définition initiale au sein d'un standard ECMA.
{{SpecName('ESDraft', '#sec-promise-objects', 'Promise')}} {{Spec2('ESDraft')}}  

Compatibilité des navigateurs

{{Compat}}

Voir aussi

Source de la révision

<div>{{JSRef}}</div>

<p>L'objet <code><strong>Promise</strong></code> (pour « promesse ») est utilisé pour réaliser des traitements de façon asynchrone. Une promesse représente une opération qui n'a pas encore été complétée, mais qui est attendue dans le futur.</p>

<h2 id="Syntaxe">Syntaxe</h2>

<pre class="syntaxbox">
new Promise( /* exécuteur */ function(resolve, reject) { ... } );</pre>

<h3 id="Paramètres">Paramètres</h3>

<dl>
 <dt><code>exécuteur</code></dt>
 <dd>Un objet fonction qui prend deux arguments : <code>resolve</code> et <code>reject</code>. Cette fonction est exécutée immédiatement par l'implémentation de <strong><code>Promise</code></strong> qui fournit les fonctions <code>resolve</code> et <code>reject</code> (elle est exécutée avant que le constructeur <strong><code>Promise</code></strong> ait renvoyé l'objet créé). Les fonctions <code>resolve</code> et <code>reject</code> sont liées à la promesse et appeler l'une ou l'autre change respectivement l'état de la promesse en <em>tenue</em> si tout c'est bien passé ou en <em>rompue</em> si une erreur à eu lieu. On attend de l'exécuteur qu'il démarre un travail asynchrone puis, une fois le travail terminé, appelle la fonction <code>resolve</code> ou la fonction <code>reject</code> pour définir l'état final de la promesse.</dd>
</dl>

<h2 id="Description">Description</h2>

<p>L'interface <strong><code>Promise</code></strong> représente un intermédiaire (<em>proxy</em>) vers une valeur qui n'est pas nécessairement connue au moment de sa création. Cela permet d'associer des gestionnaires au succès éventuel d'une action asynchrone et à la raison d'une erreur. Ainsi, des méthodes asynchrones renvoient des valeurs comme les méthodes synchrones, la seule différence est que la valeur retournée par la méthode asynchrone est une promesse (d'avoir une valeur plus tard).</p>

<p>Une <code>Promise</code> est dans un de ces états :</p>

<ul>
 <li><em>pending (en attente)</em> : état initial, la promesse n'est ni remplie, ni rompue ;</li>
 <li><em>fulfilled (tenue</em>) : l'opération a réussi ;</li>
 <li><em>rejected (rompue)</em> : l'opération a échoué ;</li>
 <li><em>settled (acquitée)</em> : la promesse est tenue ou rompue mais elle n'est plus en attente.</li>
</ul>

<p>Une promesse en attente peut être <em>tenue</em> avec une valeur ou <em>rompue</em> avec une raison (erreur). Quand on arrive à l'une des deux situations, les gestionnaires associés lors de l'appel de la méthode <code>then</code> sont alors appelés. (Si la promesse a déjà été tenue ou rompue lorsque le gestionnaire est attaché à la promesse, le gestionnaire est appelé. Cela permet qu'il n'y ait pas de situation de compétition entre une opération asynchrone en cours et les gestionnaires ajoutés).</p>

<p>Les méthodes {{jsxref("Promise.then","Promise.prototype.then()")}} et {{jsxref("Promise.catch","Promise.prototype.catch()")}} renvoient des promesses et peuvent ainsi être chaînées. C'est ce qu'on appelle une <em>composition</em>.</p>

<p><img alt="" src="https://mdn.mozillademos.org/files/8633/promises.png" style="height:297px; width:801px" /></p>

<div class="note">
<p><strong>Note</strong>: Une promesse est dans l'état <em>settled </em>(acquittée) qu'elle soit tenue ou rompue mais plus en attente. Le terme <em>resolved</em> (résolue) est aussi utilisé concernant les promesses — cela signifie que la promesse est acquittée ou bien enfermée dans une chaine de promesse. Le billet de Domenic Denicola, <a href="https://github.com/domenic/promises-unwrapping/blob/master/docs/states-and-fates.md">States and fates (en anglais)</a>, contient de plus amples détails sur la terminologie utilisée.</p>
</div>

<div class="warning">
<p><strong>Attention :</strong> D'autres langages utilisent des mécanismes d'évaluation à la volée (<em>lazy evaluation</em>) et de déport des calculs (<em>deferring computations</em>). Ces mécanismes sont également intitulés promesses (<em>promises</em>). En JavaScript, les promesses correspondent à des processus déjà lancés et qui peuvent être chaînés avec des fonctions de retour. Si vous cherchez à retarder l'évaluation, vous pouvez utiliser les fonctions fléchées sans arguments (ex. <code>f = () =&gt; expression</code>) afin de créer une expression à évaluer plus tard et utiliser <code>f()</code> pour l'évaluer au moment voulu.</p>
</div>

<h2 id="Propriétés">Propriétés</h2>

<dl>
 <dt><code>Promise.length</code></dt>
 <dd>Une propriété de longueur qui vaut 1 (le nombre d'arguments pour le constructeur).</dd>
 <dt>{{jsxref("Promise.prototype")}}</dt>
 <dd>Cette propriété représente le prototype du constructeur <code>Promise</code>.</dd>
</dl>

<h2 id="Méthodes">Méthodes</h2>

<dl>
 <dt>{{jsxref("Promise.all", "Promise.all(itérable)")}}</dt>
 <dd>Renvoie une promesse tenue lorsque toutes les promesses de l'argument itérable&nbsp;sont tenues ou bien une promesse rompue dès qu'une promesse de l'argument itérable est rompue. Si la promesse est tenue, elle est résolue avec un tableau contenant les valeurs de résolution des différentes promesses contenues dans l'itérable (dans le même ordre que celui-ci). Si la promesse est rompue, elle contient la raison de la rupture de la part de la promesse en cause, contenue dans l'itérable. Cette méthode est utile pour agréger les résultats de plusieurs promesses tous ensemble.</dd>
 <dt>{{jsxref("Promise.race", "Promise.race(itérable)")}}</dt>
 <dd>Renvoie une promesse qui est tenue ou rompue dès que l'une des promesses de l'itérable est tenue ou rompue avec la valeur ou la raison correspondante.</dd>
</dl>

<dl>
 <dt>{{jsxref("Promise.reject", "Promise.reject(raison)")}}</dt>
 <dd>Renvoie un objet <code>Promise</code> qui est rompue avec la raison donnée.</dd>
</dl>

<dl>
 <dt>{{jsxref("Promise.resolve", "Promise.resolve(valeur)")}}</dt>
 <dd>Renvoie un objet <code>Promise</code> qui est tenue (résolue) avec la valeur donnée. Si la valeur possède une méthode <code>then</code>, la promesse renvoyée « suivra » cette méthode pour arriver dans son état, sinon la promesse renvoyée sera tenue avec la valeur fournie. Généralement, quand on veut savoir si une valeur est une promesse, on utilisera {{jsxref("Promise.resolve","Promise.resolve(valeur)")}} et on travaillera avec la valeur de retour en tant que promesse.</dd>
</dl>

<h2 id="Promise_prototype"><code>Promise</code> prototype</h2>

<h3 id="Propriétés_2">Propriétés</h3>

<p>{{page('fr/docs/Web/JavaScript/Reference/Objets_globaux/Promise/prototype','Propriétés')}}</p>

<h3 id="Méthodes_2">Méthodes</h3>

<p>{{page('fr/docs/Web/JavaScript/Reference/Objets_globaux/Promise/prototype','Méthodes')}}</p>

<h2 id="Exemples">Exemples</h2>

<h3 id="Créer_un_objet_Promise">Créer un objet <code>Promise</code></h3>

<pre class="brush: html hidden">
&lt;button id="btn" type="button"&gt;Créer un objet Promise !&lt;/button&gt;
&lt;div id="log"&gt;&lt;/div&gt; 
</pre>

<p>Dans le court exemple qui suit, on illustre le mécanisme d'une <code>Promise</code>. La méthode <code>testPromise()</code> est appelée chaque fois qu'on clique sur l'élément {{HTMLElement("button")}}. Cette méthode crée une promesse qui sera tenue grâce à la fonction {{domxref("window.setTimeout()")}}, et avec la valeur comptePromesse (nombre commançant à 1) après <code>1s</code> à <code>3s</code> (aléatoire). Le constructeur Promise() est utilisé pour créer la promesse.</p>

<p>Le fait que la promesse soit tenue est simplement enregistré via un <em>callback</em> sur <code>p1.then()</code>. Quelques indicateurs illustrent la manière dont la partie synchrone est découplée de la partie asynchrone.</p>

<pre class="brush: js">
'use strict';
var comptePromesse = 0;

function testPromise() {
  var thisComptePromesse = ++comptePromesse;

  var log = document.getElementById('log');
  log.insertAdjacentHTML('beforeend', thisComptePromesse + 
      ') Started (&lt;small&gt;Début du code synchrone&lt;/small&gt;)&lt;br/&gt;');

  // on crée une nouvelle promesse :
  var p1 = new Promise(
    // La fonction de résolution est appelée avec la capacité de 
    // tenir ou de rompre la promesse
    function(resolve, reject) {       
      log.insertAdjacentHTML('beforeend', thisComptePromesse + 
          ') Promise started (&lt;small&gt;Début du code asynchrone&lt;/small&gt;)&lt;br/&gt;');

      // Voici un exemple simple pour créer un code asynchrone
      window.setTimeout(
        function() {
          // On tient la promesse !
          resolve(thisComptePromesse);
        }, Math.random() * 2000 + 1000);
    });

  // On définit ce qui se passe quand la promesse est tenue
  // et ce qu'on appelle (uniquement) dans ce cas
  // La méthode catch() définit le traitement à effectuer
  // quand la promesse est rompue.
  p1.then(
    // On affiche un message avec la valeur
    function(val) {
      log.insertAdjacentHTML('beforeend', val +
          ') Promise fulfilled (&lt;small&gt;Fin du code asynchrone&lt;/small&gt;)&lt;br/&gt;');
    }).catch(
      // Promesse rejetée
      function() { 
        console.log("promesse rompue");
      });

  log.insertAdjacentHTML('beforeend', thisComptePromesse + 
      ') Promise made (&lt;small&gt;Fin du code synchrone&lt;/small&gt;)&lt;br/&gt;');
}
</pre>

<pre class="brush: js hidden">
if ("Promise" in window) {
  var btn = document.getElementById("btn");
  btn.addEventListener("click", testPromise);
 } else {
  log = document.getElementById('log');
  log.innerHTML = "L'exemple live n'est pas disponible pour votre navigateur car celui-ci ne supporte pas l'interface &lt;code&gt;Promise&lt;code&gt;.";
}</pre>

<p>L'exemple s'exécute lorsqu'on clique sur le bouton. Pour tester cet exemple, il est nécessaire d'utiliser un navigateur qui supporte les objets <code>Promise</code>. En cliquant plusieurs fois sur le bouton en peu de temps, on verra qu'il y a plusieurs promesses tenues les une après les autres.</p>

<p>{{EmbedLiveSample('Créer_un_objet_Promise', '500', '200')}}</p>

<h3 id="Utiliser_XMLHttpRequest()_avec_une_promesse">Utiliser XMLHttpRequest() avec une promesse</h3>

<p>Dans l'exemple qui suit, on illustre comment utiliser une promesse pour fournir le résultat d'une requête&nbsp;{{domxref("XMLHttpRequest")}} :</p>

<pre class="brush: js">
'use strict';

// A-&gt; $http cette fonction est implémentée pour respecter le patron
// de conception (pattern) Adaptateur
function $http(url){
 
  // Un exemple d'objet
  var core = {

    // La méthode qui effectue la requête AJAX
    ajax : function (method, url, args) {

      // On établit une promesse en retour
      var promise = new Promise( function (resolve, reject) {

        // On instancie un XMLHttpRequest
        var client = new XMLHttpRequest();
        var uri = url;

        if (args &amp;&amp; (method === 'POST' || method === 'PUT')) {
          uri += '?';
          var argcount = 0;
          for (var key in args) {
            if (args.hasOwnProperty(key)) {
              if (argcount++) {
                uri += '&amp;';
              }
              uri += encodeURIComponent(key) + '=' + encodeURIComponent(args[key]);
            }
          }
        }

        client.open(method, uri);
        client.send();

        client.onload = function () {
          if (this.status &gt;= 200 &amp;&amp; this.status &lt; 300) {
            // On utilise la fonction "resolve" lorsque this.status vaut 2xx
            resolve(this.response);
          } else {
            // On utilise la fonction "reject" lorsque this.status est différent de 2xx
            reject(this.statusText);
          }
        };
        client.onerror = function () {
          reject(this.statusText);
        };
      });

      // Return the promise
      return promise;
    }
  };

  // Pattern adaptateur
  return {
    'get' : function(args) {
      return core.ajax('GET', url, args);
    },
    'post' : function(args) {
      return core.ajax('POST', url, args);
    },
    'put' : function(args) {
      return core.ajax('PUT', url, args);
    },
    'delete' : function(args) {
      return core.ajax('DELETE', url, args);
    }
  };
};
// Fin de A

// B-&gt; Ici on définit les fonctions et les charges utiles
var mdnAPI = 'https://developer.mozilla.org/en-US/search.json';
var payload = {
  'topic' : 'js',
  'q'     : 'Promise'
};

var callback = {
  success : function(data){
     console.log(1, 'success', JSON.parse(data));
  },
  error : function(data){
     console.log(2, 'error', JSON.parse(data));
  }
};
// End B

// On exécute la méthode
$http(mdnAPI)
  .get(payload)
  .then(callback.success)
  .catch(callback.error);

// Une alternative qui appelle la méthode et permet de gérer le rejet de la promesse différemment
$http(mdnAPI)&nbsp;
&nbsp; .get(payload)&nbsp;
&nbsp; .then(callback.success, callback.error);

// Une autre alternative pour la gestion du rejet de la promesse
$http(mdnAPI)&nbsp;
&nbsp; .get(payload)&nbsp;
&nbsp; .then(callback.success)
&nbsp; .then(undefined, callback.error);
</pre>

<h3 id="Charger_une_image_en_XHR">Charger une image en XHR</h3>

<p>Un autre exemple simple utilisant <code>Promise</code> et <code><a href="/fr/docs/Web/API/XMLHttpRequest">XMLHttpRequest</a></code> afin de charger une image est disponible sur le dépôt GitHub MDN<a href="https://github.com/mdn/promises-test/blob/gh-pages/index.html"> promise-test</a>. Vous pouvez également consulter le résultat obtenu <a href="https://mdn.github.io/promises-test/">sur cette page</a>. Chaque étape est commentée afin de vous permettre de suivre l'état de la promesse et l'architecture utilisée avec XHR.</p>

<h2 id="Spécifications">Spécifications</h2>

<table class="standard-table">
 <tbody>
  <tr>
   <th scope="col">Spécification</th>
   <th scope="col">État</th>
   <th scope="col">Commentaires</th>
  </tr>
  <tr>
   <td>{{SpecName('ES6', '#sec-promise-objects', 'Promise')}}</td>
   <td>{{Spec2('ES6')}}</td>
   <td>Définition initiale au sein d'un standard ECMA.</td>
  </tr>
  <tr>
   <td>{{SpecName('ESDraft', '#sec-promise-objects', 'Promise')}}</td>
   <td>{{Spec2('ESDraft')}}</td>
   <td>&nbsp;</td>
  </tr>
 </tbody>
</table>

<h2 id="Compatibilité_des_navigateurs">Compatibilité des navigateurs</h2>

<p class="hidden">Pour contribuer à ces données de compatibilité, vous pouvez envoyer une poule requête sur : <a href="https://github.com/mdn/browser-compat-data/blob/master/javascript/promise.json">https://github.com/mdn/browser-compat-data/blob/master/javascript/promise.json</a>.</p>

<p>{{Compat}}</p>

<h2 id="Voir_aussi">Voir aussi</h2>

<ul>
 <li><a href="https://promisesaplus.com/">Promises/A+ specification</a></li>
 <li><a href="https://www.html5rocks.com/en/tutorials/es6/promises/">Jake Archibald : JavaScript Promises : There and Back Again</a> (tutoriel en anglais)</li>
 <li><a href="https://de.slideshare.net/domenicdenicola/callbacks-promises-and-coroutines-oh-my-the-evolution-of-asynchronicity-in-javascript">Domenic Denicola : Callbacks, Promises, and Coroutines – Asynchronous Programming Patterns in JavaScript</a> (présentation en anglais sur l'asynchronisme en JavaScript)</li>
 <li><a href="https://www.mattgreer.org/articles/promises-in-wicked-detail/">Matt Greer : JavaScript Promises ... In Wicked Detail</a> (en anglais)</li>
 <li><a href="https://www.promisejs.org/">Forbes Lindesay : promisejs.org</a> (en anglais)</li>
 <li><a href="https://pouchdb.com/2015/05/18/we-have-a-problem-with-promises.html">Nolan Lawson: We have a problem with promises - Common mistakes with promises</a> (en anglais)</li>
 <li><a href="https://github.com/jakearchibald/es6-promise/">Prothèse pour les promesses par Jake Archibald</a></li>
 <li><a href="https://www.udacity.com/course/javascript-promises--ud898">Les promesses JavaScript sur Udacity</a> (en anglais)</li>
</ul>
Revenir à cette révision