Was ist das Zeug drin? [[]]
Meine Frage ist, was die doppelten Klammern [[]] bedeuten und wie ich den Wert von [[PromiseValue]] abrufe.
Es ist eine interne Eigenschaft. Sie können nicht direkt darauf zugreifen. Native Versprechungen können nur then
mit Versprechungen oder allgemein asynchron ausgepackt werden - siehe So geben Sie die Antwort von einem asynchronen Aufruf zurück . Zitieren der Spezifikation:
Sie werden durch diese Spezifikation ausschließlich zu Expository-Zwecken 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 sind in doppelten eckigen Klammern [[]] eingeschlossen . 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
Im Ernst - was sind sie?
Sehr schön! Wie aus dem obigen Zitat hervorgeht, werden sie nur in der Spezifikation verwendet. Es gibt also keinen Grund, warum sie wirklich in Ihrer Konsole angezeigt werden.
Sagen Sie es niemandem, aber dies sind wirklich private Symbole . Der Grund dafür ist, dass andere interne Methoden darauf zugreifen können [[PromiseValue]]
. Wenn io.js beispielsweise beschließt, Versprechen zurückzugeben, anstatt Rückrufe entgegenzunehmen, kann io.js schnell auf diese Eigenschaften zugreifen, wenn dies garantiert ist. Sie sind nicht nach außen ausgesetzt.
Kann ich darauf zugreifen?
Nur wenn Sie Ihren eigenen Chrome- oder V8-Build erstellen. Möglicherweise in ES7 mit Zugriffsmodifikatoren. Ab sofort gibt es keine Möglichkeit, da sie nicht Teil der Spezifikation sind und über alle Browser hinweg funktionieren - sorry.
Wie bekomme ich meinen Wert?
getDefinitions().then(function(defs){
});
Was aber, wenn ein Fehler zurückgegeben wird? Fügen Sie in Bezug auf diese Fälle Folgendes am Ende (und außerhalb) Ihrer .then () hinzu.
.catch(function(defs){
});
Obwohl, wenn ich raten müsste - Sie 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 wenn sie bereits ein Versprechen zurückgibt, das gemacht wird es wurde behoben (was bedeutet, dass Sie die Konvertierung überhaupt nicht benötigen - nur return
.