le paradigme des Promesses

Promesses.

Les promises (pour promesses) sont des objets en JS, représentant une valeur qui pourrait être retournée par l’exécution d’une opération unique de façon asynchrone.

Pour prendre un exemple simple  « imaginons que votre maman vous promet de vous acheter un nouveau téléphone la semaine prochaine ».

Vous ne savez pas si vous allez avoir ce téléphone jusqu’à ce que le jour J arrive. Votre maman peut vraiment acheter le téléphone ou bien elle peut refuser de l’acheter car vous n’avez pas été gentil.

Cela nous donne trois états :

  • Pending : la promesse est en attente.
  • Resolved : la promesse est tenue
  • Rejected: la promesse est rompue

Une fois tenue ou rompue la promesse ne peut plus changer d’état.

exemple :

var isMomHappy = false;
 
// Promesse
var willIGetNewPhone = new Promise(
    function (resolve, reject) {
        if (isMomHappy) {
            var phone = {
                brand: 'Samsung',
                color: 'black'
            };
            resolve(phone); // promesse tenue
        } else {
            var reason = new Error('mom is not happy');
            reject(reason); // promesse rompue
        }
 
    }
);

Dans cet exemple simple, nous avons un booléen isMomHappy, qui détermine si maman est contente ou pas.

Nous avons ensuite notre promesse willIGetNewPhone qui peut être tenue ou non selon l’humeur de maman.

Si la promesse est tenue, on appel resolve(ma_valeur_succes), donc on récupère notre téléphone =). À contrario si la promesse est rompue on appelle reject(ma_valeur_erreur) maman n’est pas contente est donc pas de téléphone =(

// appel de la promesse
var askMom = function () {
    willIGetNewPhone
        .then(function (fulfilled) {
            // yay, you got a new phone
            console.log(fulfilled);
        })
        .catch(function (error) {
            // ops, mom don't buy it
            console.log(error.message);
        });
}
 
askMom();

Ici on appel notre promesse on demande à maman si je vais avoir un nouveau téléphone. Pour contrôler notre action il y a deux mots clefs .then et .error.

Dans notre cas le .then est suivi de function(fullfilled){ … } la valeur de fulfilled est la valeur en cas de succès => le téléphone.

dans le catch est suivi de function(error){ … } la valeur d’error est la valeur en cas d’échec => le mécontentement de maman.

Chaînage de promesse

Après que maman m’est promis un nouveau téléphone j’ai été voir voir mon copain pour lui promettre que je lui montrerais une fois que j’aurais ce téléphone.

var showOff = function (phone) {
    return new Promise(
        function (resolve, reject) {
            var message = 'Hey friend, I have a new ' +
                phone.color + ' ' + phone.brand + ' phone';
 
            resolve(message);
        }
    );
};

Dans cet exemple on peut voir que le reject est optionnel pour une promesse. Et que la promesse showOff débute après la promesse willIGetNewPhone.

Asynchronisme

Les promesses sont asynchrones. qu’est-ce que cela veux dire ? cela veux dire que la lecture du programme peut continuer pendant le traitement d’une promesse.

// appel de la promesse
var askMom = function () {
    console.log('before asking Mom'); // log avant
    willIGetNewPhone
        .then(showOff)
        .then(function (fulfilled) {
            console.log(fulfilled);
        })
        .catch(function (error) {
            console.log(error.message);
        });
    console.log('after asking mom'); // log après
};

La séquence qui est attendu est la suivante :

1. before asking Mom
2. Hey friend, I have a new black Samsung phone.
3. after asking mom

Mais la séquence obtenu est la suivante :

1. before asking Mom
2. after asking mom
3. Hey friend, I have a new black Samsung phone.

 

L’exécution du code continu sans blocage, ni sans attendre de résultat.

 

Source :

Les promesses pour les nuls

Web fundamental

MDN

 

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée.