Ich habe die folgende Funktion und versuche, Promises zu verwenden.
var getDefinitions = function(){
return new Promise(function(resolve){
resolve(ContactManager.request("definition:entities"));
});
}
var definitions = getDefinitions()
kehrt zurück:
Promise {[[PromiseStatus]]: "resolved", [[PromiseValue]]: child}
Ich möchte den Wert von PromiseValue erhalten, aber fragen nach
var value = definitions.PromiseValue
gibt mir ein undefiniertes Ergebnis.
Meine Frage ist, was die doppelten Klammern [[ ]]
bedeuten, und wie rufe ich den Wert von [[PromiseValue]]
ab.
[[]]
Meine Frage ist, was bedeuten die doppelten Klammern [[]] und wie erhalte ich den Wert von [[PromiseValue]].
Es ist eine interne Eigenschaft. Sie können nicht direkt darauf zugreifen. Native Versprechungen können nur in then
mit Versprechungen oder asynchron im Allgemeinen entpackt werden - siehe Rückgabe der Antwort von einem asynchronen Aufruf . Zitat der Spezifikation:
Sie werden durch diese Spezifikation lediglich zu Ausstellungszwecken definiert. Eine Implementierung von ECMAScript muss sich so verhalten, als würde sie interne Eigenschaften auf die hier beschriebene Weise erzeugen und bearbeiten. Die Namen der internen Eigenschaften stehen in doppelten eckigen Klammern [[]] . Wenn ein Algorithmus eine interne Eigenschaft eines Objekts verwendet und das Objekt die angegebene interne Eigenschaft nicht implementiert, wird eine TypeError-Ausnahme ausgelöst.
Du kannst nicht
Sehr schön! Wie das obige Zitat besagt, werden sie nur in der Spezifikation verwendet - es gibt also keinen Grund, warum sie wirklich in Ihrer Konsole erscheinen.
Sag es niemandem, aber das sind wirklich private Symbole . Der Grund dafür ist, dass andere interne Methoden auf [[PromiseValue]]
Zugreifen können. Wenn io.js beispielsweise entscheidet, Versprechungen zurückzugeben, anstatt Rückrufe entgegenzunehmen, kann es auf diese Eigenschaften schnell zugreifen, falls dies garantiert ist. Sie sind nicht nach außen ausgesetzt.
Es sei denn, Sie erstellen Ihr eigenes Chrome oder V8-Build. Vielleicht gibt es in ES7 mit Zugriffsmodifikatoren im Moment keine Möglichkeit, da sie nicht Teil der Spezifikation sind und über verschiedene Browser hinweg funktionieren - sorry.
getDefinitions().then(function(defs){
//access them here
});
Wenn ich allerdings raten müsste - Sie sind konvertieren die API zunächst nicht richtig da diese Konvertierung nur funktionieren würde, wenn die Methode synchron ist (in diesem Fall kein Versprechen zurückgeben) oder es gibt bereits ein Versprechen zurück, mit dem es gelöst wird (was bedeutet, dass Sie die Konvertierung überhaupt nicht benötigen - nur return
).
Heute bin ich auch auf dieses Problem eingegangen und habe zufällig eine Lösung gefunden.
Meine Lösung sieht so aus:
fetch('http://localhost:3000/hello')
.then(dataWrappedByPromise => dataWrappedByPromise.json())
.then(data => {
// you can access your data here
console.log(data)
})
Hier ist dataWrappedByPromise
eine Promise
-Instanz. Um auf die Daten in der Promise
-Instanz zuzugreifen, habe ich festgestellt, dass ich unwrap diese Instanz mit der .json()
-Methode nur noch benötigen musste.
Hoffentlich hilft das!
Dieses Beispiel ist mit reagieren, sollte aber größtenteils gleich sein.
Ersetzen Sie this.props.url durch Ihre URL, um sie abzurufen, damit sie für die meisten anderen Frameworks funktioniert.
Das Analysieren von res.json () gibt den [[promiseValue]] zurück. Wenn Sie es jedoch an eine andere .then () - Methode weitergeben, können Sie es als totales Array zurückgeben.
let results = fetch(this.props.url)
.then((res) => {
return res.json();
})
.then((data) => {
return data;
})
Ich denke, dass es gut dazu passt.
(async () => {
let getDefinitions = await ( () => {
return new Promise( (resolve, reject) => {
resolve(ContactManager.request("definition:entities"));
});
})();
)();
So greifen Sie auf das PromiseValue
(promise
) zu:
let promises = definitions;
Promise.all(promises).then((promise) => {
console.log('promises = ', promises);
console.log('promise = ', promise);
});
Wenn Sie die Manpage lesen, können wir Folgendes sehen:
Der momentane Zustand und der Wert eines Versprechens können nicht .__ sein. synchron vom Code aus geprüft, ohne die
then()
-Methode aufzurufen.Um beim Debuggen zu helfen, nur bei der Prüfung eines Versprechungsobjekts manuell können Sie weitere Informationen als spezielle Eigenschaften anzeigen, nämlich In Code kann nicht zugegriffen werden (dies wird derzeit implementiert durch das Eigenschaftennamen wird randomisiert, da keine fortgeschrittenere Sprach- oder Debugger-Unterstützung vorhanden ist).
Betonung meiner. Daher können Sie nicht tun, was Sie tun möchten. Die bessere Frage ist warum Müssen Sie so auf den Versprechen-Status zugreifen?