:::: MENU ::::

Promise.finally pour ES2018 ?

Les promesses évoluent et une nouvelle méthode finally devrait voire le jour prochainement.

A l’issue de la dernière réunion du TC39, le comité technique en charge de la spécification de JavaScript a décidé de passer une proposition d’évolution d’ecmascript concernant les promesses au « stage 3 ».

Cela signifie qu’il y a de fortes chances que l’on voit débarquer cette nouvelle méthode dans les navigateurs et nodejs prochainement.

Petit rappel

Cette nouveauté concerne l’objet Promise présent depuis ES2015. Au cas ou vous débarquiez de l’an 2005, les promesses (ou futures) sont un mécanisme qui permet de traiter l’asynchrone d’une autre manière que les célèbres callback.

En JavaScript, une promesse est initialisée avec deux arguments ( resolve et reject ) . Ce sont des méthodes qui sont appelées à l’issue d’un traitement asynchrone pour respectivement valider la promesse ou rejeter la promesse.

Le rejet d’une promesse peut être traité à l’aide de la méthode catch ou bien comme 2eme argument de la méthode then.

 

Cet exemple, illustre la création et  l’utilisation d’une promesse pour effectuer des requetes AJAX


function maFonctionAsynchrone(url) {
  return new Promise((resolve, reject) => {
    const xhr = new XmlHttpRequest();
    xhr.open("GET", url);
    xhr.onload = () => resolve(xhr.responseText);
    xhr.onerror = () => reject(xhr.statusText);
  });
};

maFonctionAsynchrone("urltest.com")
.then(reponse => {/* traitement reponse*/ })
.catch(err => {/* traitement erreur */ })

On constate l’usage des méthodes then et catch d’une promesse. Leur définition est la suivante


Promise.prototype.catch(onRejected)

Promise.prototype.then(onFulfilled, onRejected)

Qu’est ce qui change ?

La plupart des librairies qui implémentent les promesses proposent déjà la notion de « finally ».  Il s’agit simplement d’exécuter une fonction quelque soit le retour de la promesse.

Le cas typique est le masquage d’un indicateur de chargement.


afficheLoader()

maFonctionAsynchrone("urltest.com")

.then(reponse => {/* traitement reponse*/ })

.catch(err => {/* traitement erreur */ }

.finally(masqueLoader)

L’intérêt est de ne pas avoir à dupliquer deux fois l’appel de la fonction masqueLoader

 

Le nom finally est cohérent avec le traitement des erreurs ( try catch finally )

 

Bilan

Au final ce n’est pas une énorme nouveauté , plus du sucre syntaxique, mais cela montre que la specification de JavaScript évolue en continue et notamment dans le but d’améliorer l’expérience de l’écriture du code


So, what do you think ?