web-dev-qa-db-ja.com

javascriptでの二重括弧の意味とそれらへのアクセス方法

状況

Promiseを使用する次の関数があります。

var getDefinitions = function() {
    return new Promise(function(resolve) {
        resolve(ContactManager.request("definition:entities"));
    });
}

var definitions = getDefinitions()

definitionsの内容は次のとおりです。

Promise {
    [[PromiseStatus]]: "resolved",
    [[PromiseValue]]: child
}

PromiseValueプロパティに直接アクセスすると、undefinedが返されます

var value = definitions.PromiseValue; // undefined

質問

二重括弧[[ ]]はどういう意味ですか?[[PromiseValue]]の値を取得するにはどうすればよいですか。

54
Jeff

[[]]の中身は何ですか

私の質問は、二重角括弧[[]]の意味と、[[PromiseValue]]の値を取得する方法です。

これは内部プロパティです。直接アクセスすることはできません。ネイティブプロミスは、プロミスを伴うthenでのみ、または一般的に非同期でアンラップできます- 非同期呼び出しから応答を返す方法 を参照してください。仕様の引用:

これらは純粋に説明目的のためにこの仕様で定義されています。 ECMAScriptの実装は、ここで説明した方法で内部プロパティを生成および操作したかのように動作する必要があります。 内部プロパティの名前は、二重角括弧[[]]で囲まれています。アルゴリズムがオブジェクトの内部プロパティを使用し、オブジェクトが指定された内部プロパティを実装しない場合、TypeError例外がスローされます。

できません

真剣に-彼らは何ですか?

非常に素晴らしい!上記の引用で述べられているように、それらは仕様で使用されているだけなので、実際にコンソールに表示される理由はありません。

誰にも言ってはいけませんが、これらは本当にプライベートシンボルです。それらが存在する理由は、他のinternalメソッドが[[PromiseValue]]にアクセスできるようにするためです。たとえば、io.jsがコールバックを取得する代わりにプロミスを返すことを決定した場合-保証されている場合、これらのプロパティにすばやくアクセスできます。それらは外部に露出されていません

それらにアクセスできますか?

独自にChromeまたはV8ビルドを作成する場合を除きます。ES7ではアクセス修飾子を使用している可能性があります。

だから私は自分の価値を手に入れるのですか?

getDefinitions().then(function(defs){
    //access them here
});

私が推測しなければならなかった場合-あなたは APIを最初から正しく変換していない この変換はメソッドが同期の場合(その場合は約束を返さない)または解決するプロミスをすでに返します(つまり、変換はまったく必要ありません-returnだけです。

87

私も今日この問題に取り組み、偶然解決策を見つけました。

私の解決策は次のようになります:

_fetch('http://localhost:3000/hello')
.then(dataWrappedByPromise => dataWrappedByPromise.json())
.then(data => {
    // you can access your data here
    console.log(data)
})
_

ここで、dataWrappedByPromisePromiseインスタンスです。 Promiseインスタンスのデータにアクセスするには、.json()メソッドでnwrapそのインスタンスが必要であることがわかりました。

お役に立てば幸いです!

10
cafemike

これの例はreactを使用していますが、ほとんどの場合同じです。

Replace this.props.urlを取得するURLで取得して、他のほとんどのフレームワークで機能するようにします。

res.json()を解析すると[[promiseValue]]が返されますが、それを別の。then()メソッドに返す場合は、合計配列として返すことができます。

let results = fetch(this.props.url)
        .then((res) => {
            return res.json();
        })
        .then((data) => {
            return data;
        })
2
Lachlan Young

PromiseValuepromise)にアクセスする方法は次のとおりです。

  let promises = definitions;

  Promise.all(promises).then((promise) => {
    console.log('promises = ', promises);

    console.log('promise = ', promise);
  });
0
caot

マンページ を読むと、次のことがわかります。

設計上、then()メソッドを呼び出さないと、プロミスのインスタント状態と値をコードから同期的に検査することはできません。

デバッグを支援するために、promiseオブジェクトを手動で検査する場合にのみ、コードからアクセスできない特別なプロパティとして詳細を見ることができます(現在、より洗練された言語またはデバッガーのサポートがないため、プロパティ名をランダム化することで実装されます)。

強調鉱山。したがって、やりたいことはできません。より良い質問はwhyそのような約束状態にアクセスする必要があるのですか?

0
Nit