web-dev-qa-db-ja.com

ES6の約束が実現/拒否/解決したかどうかを知る方法はありますか?

私はDojoの約束に慣れていて、次のことができます。

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

ES6の約束が履行、解決、または拒否されたかどうかを判断する方法はありますか?そうでない場合、Object.defineProperty(Promise.prototype, ...)を使用してその機能を埋める方法はありますか?

45
knpwrs

これらは仕様の一部ではなく、ポリフィルを構築するプロミスの内部状態を取得するために使用できる標準的なアクセス方法もありません。ただし、ラッパーを作成することにより、標準プロミスをこれらの値を持つものに変換できます。

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

これは、プロトタイプを変更する場合のように、すべてのプロミスに影響を与えるわけではありませんが、プロミスをその状態を公開するプロミスに変換できます。

45
chuckj