web-dev-qa-db-de.com

Kann ich feststellen, ob ein ES6-Versprechen erfüllt / abgelehnt / gelöst wurde?

Ich bin an Dojo-Versprechen gewöhnt, bei denen ich einfach Folgendes tun kann:

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

Gibt es eine Möglichkeit, festzustellen, ob eine ES6-Zusage erfüllt, gelöst oder abgelehnt wurde? Wenn nicht, gibt es eine Möglichkeit, diese Funktionalität mit Object.defineProperty(Promise.prototype, ...) auszufüllen?

45
knpwrs

Sie sind weder Teil der Spezifikation noch gibt es eine Standardmethode für den Zugriff darauf, mit der Sie den internen Status des Versprechens für die Erstellung einer Polyfüllung ermitteln können. Sie können jedoch jedes Standardversprechen in ein Versprechen mit diesen Werten umwandeln, indem Sie einen Wrapper erstellen.

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;
}

Dies wirkt sich nicht auf alle Versprechungen aus, wie dies beim Ändern des Prototyps der Fall wäre. Sie können jedoch eine Versprechung in eine Versprechung umwandeln, die ihren Status offenlegt.

45
chuckj