web-dev-qa-db-de.com

Was bedeutet [[PromiseValue]] in der JavaScript-Konsole und wie bekomme ich es?

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.

47
Jeff

Was ist das Zeug drin [[]]

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

Im Ernst - was sind sie?

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.

Kann ich darauf zugreifen?

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.

Also bekomme ich meinen Wert?

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).

87

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!

11
cafemike

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;
        })
3
Lachlan Young

Ich denke, dass es gut dazu passt.

(async () => {
  let getDefinitions = await ( () => {
    return new Promise( (resolve, reject) => {
      resolve(ContactManager.request("definition:entities"));
    });
  })();
)();
0
Shun ITOH

So greifen Sie auf das PromiseValue (promise) zu:

  let promises = definitions;

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

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

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?

0
Nit