Подтвердить что ты не робот

Есть ли способ узнать, выполнено ли обещание ES6/отклонено/разрешено?

Я использую Dojo promises, где я могу просто сделать следующее:

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

Есть ли способ определить, выполнено ли обещание ES6, разрешено или отклонено? Если нет, есть ли способ заполнить эту функциональность, используя Object.defineProperty(Promise.prototype, ...)?

4b9b3361

Ответ 1

Они не являются частью спецификации и не имеют стандартного способа доступа к ним, которые вы могли бы использовать, чтобы получить внутреннее состояние обещания для построения polyfill. Тем не менее, вы можете преобразовать любое стандартное обещание в одно, у которого есть эти значения, создав обертку,

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

Это не влияет на все promises, поскольку модификация прототипа будет, но это позволяет вам преобразовать обещание в обещание, которое предоставляет его состояние.