JavaScript introduction


Exemple

Un objet Promise représente une opération qui a produit ou produira éventuellement une valeur. Les promesses fournissent un moyen robuste d’emballer le résultat (éventuellement en attente) du travail asynchrone, en atténuant le problème des rappels profondément imbriqués (connus sous le nom de « callback hell »).

États et flux de contrôle

Une promesse peut être dans l'un des trois états suivants:

  • pending - L'opération sous-jacente n'est pas encore terminée et la promesse est en cours d' exécution.
  • réalisé - L'opération est terminée et la promesse est remplie avec une valeur . Cela revient à renvoyer une valeur à partir d'une fonction synchrone.
  • rejeté - Une erreur est survenue pendant l'opération et la promesse est rejetée avec un motif . Cela revient à lancer une erreur dans une fonction synchrone.

Une promesse est dite réglée (ou résolue ) lorsqu'elle est remplie ou rejetée. Une fois qu'une promesse est réglée, elle devient immuable et son état ne peut pas changer. Les méthodes then et catch d'une promesse peuvent être utilisées pour attacher des callbacks qui s'exécutent quand il est réglé. Ces rappels sont appelés avec la valeur d'exécution et la raison de rejet, respectivement.

Diagramme de promesse

Exemple

const promise = new Promise((resolve, reject) => {
    // Perform some work (possibly asynchronous)
    // ...

    if (/* Work has successfully finished and produced "value" */) {
        resolve(value);
    } else {
        // Something went wrong because of "reason"
        // The reason is traditionally an Error object, although
        // this is not required or enforced.
        let reason = new Error(message);
        reject(reason);

        // Throwing an error also rejects the promise.
        throw reason;
    }
});

Les méthodes then et catch peuvent être utilisées pour joindre des rappels d'exécution et de rejet:

promise.then(value => {
    // Work has completed successfully,
    // promise has been fulfilled with "value"
}).catch(reason => {
    // Something went wrong,
    // promise has been rejected with "reason"
});

Remarque: Appeler promise.then(...) et promise.catch(...) sur la même promesse peut entraîner une Uncaught exception in Promise si une erreur survient, que ce soit lors de l'exécution de la promesse ou dans l'un des rappels. le meilleur moyen serait de fixer le prochain auditeur sur la promesse retournée par la précédente then / catch .

Sinon, les deux callbacks peuvent être attachés à un seul appel à then :

promise.then(onFulfilled, onRejected);

Joindre des rappels à une promesse qui a déjà été réglée les placera immédiatement dans la file d'attente des microtask , et ils seront appelés "dès que possible" (c'est-à-dire immédiatement après le script en cours d'exécution). Il n'est pas nécessaire de vérifier l'état de la promesse avant de joindre des rappels, contrairement à de nombreuses autres implémentations émettant des événements.


Démo en direct