web-dev-qa-db-fra.com

Existe-t-il un moyen de savoir si une promesse ES6 est remplie / rejetée / résolue?

Je suis habitué aux promesses du Dojo, où je peux simplement faire ce qui suit:

promise.isFulfilled();
promise.isResolved();
promise.isRejected();

Existe-t-il un moyen de déterminer si une promesse ES6 est remplie, résolue ou rejetée? Sinon, existe-t-il un moyen de remplir cette fonctionnalité en utilisant Object.defineProperty(Promise.prototype, ...)?

45
knpwrs

Ils ne font pas partie de la spécification et il n'y a pas de moyen standard d'y accéder que vous pourriez utiliser pour obtenir l'état interne de la promesse de construire un polyfill. Cependant, vous pouvez convertir n'importe quelle promesse standard en une promesse contenant ces valeurs en créant un wrapper,

function MakeQuerablePromise(promise) {
    // Don't create a wrapper for promises that can already be queried.
    if (promise.isResolved) return promise;

    var isResolved = false;
    var isRejected = false;

    // Observe the promise, saving the fulfillment in a closure scope.
    var result = promise.then(
       function(v) { isResolved = true; return v; }, 
       function(e) { isRejected = true; throw e; });
    result.isFulfilled = function() { return isResolved || isRejected; };
    result.isResolved = function() { return isResolved; }
    result.isRejected = function() { return isRejected; }
    return result;
}

Cela n'affecte pas toutes les promesses, comme le ferait la modification du prototype, mais cela vous permet de convertir une promesse en promesse qui expose son état.

45
chuckj