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]]
の値を取得するにはどうすればよいですか。
[[]]
の中身は何ですか私の質問は、二重角括弧[[]]の意味と、[[PromiseValue]]の値を取得する方法です。
これは内部プロパティです。直接アクセスすることはできません。ネイティブプロミスは、プロミスを伴うthen
でのみ、または一般的に非同期でアンラップできます- 非同期呼び出しから応答を返す方法 を参照してください。仕様の引用:
これらは純粋に説明目的のためにこの仕様で定義されています。 ECMAScriptの実装は、ここで説明した方法で内部プロパティを生成および操作したかのように動作する必要があります。 内部プロパティの名前は、二重角括弧[[]]で囲まれています。アルゴリズムがオブジェクトの内部プロパティを使用し、オブジェクトが指定された内部プロパティを実装しない場合、TypeError例外がスローされます。
できません
非常に素晴らしい!上記の引用で述べられているように、それらは仕様で使用されているだけなので、実際にコンソールに表示される理由はありません。
誰にも言ってはいけませんが、これらは本当にプライベートシンボルです。それらが存在する理由は、他のinternalメソッドが[[PromiseValue]]
にアクセスできるようにするためです。たとえば、io.jsがコールバックを取得する代わりにプロミスを返すことを決定した場合-保証されている場合、これらのプロパティにすばやくアクセスできます。それらは外部に露出されていません。
独自にChromeまたはV8ビルドを作成する場合を除きます。ES7ではアクセス修飾子を使用している可能性があります。
getDefinitions().then(function(defs){
//access them here
});
私が推測しなければならなかった場合-あなたは APIを最初から正しく変換していない この変換はメソッドが同期の場合(その場合は約束を返さない)または解決するプロミスをすでに返します(つまり、変換はまったく必要ありません-return
だけです。
私も今日この問題に取り組み、偶然解決策を見つけました。
私の解決策は次のようになります:
_fetch('http://localhost:3000/hello')
.then(dataWrappedByPromise => dataWrappedByPromise.json())
.then(data => {
// you can access your data here
console.log(data)
})
_
ここで、dataWrappedByPromise
はPromise
インスタンスです。 Promise
インスタンスのデータにアクセスするには、.json()
メソッドでnwrapそのインスタンスが必要であることがわかりました。
お役に立てば幸いです!
これの例は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;
})
PromiseValue
(promise
)にアクセスする方法は次のとおりです。
let promises = definitions;
Promise.all(promises).then((promise) => {
console.log('promises = ', promises);
console.log('promise = ', promise);
});
マンページ を読むと、次のことがわかります。
設計上、
then()
メソッドを呼び出さないと、プロミスのインスタント状態と値をコードから同期的に検査することはできません。デバッグを支援するために、promiseオブジェクトを手動で検査する場合にのみ、コードからアクセスできない特別なプロパティとして詳細を見ることができます(現在、より洗練された言語またはデバッガーのサポートがないため、プロパティ名をランダム化することで実装されます)。
強調鉱山。したがって、やりたいことはできません。より良い質問はwhyそのような約束状態にアクセスする必要があるのですか?