Que signifie [[PromiseValue]] dans la console javascript et comment l'obtenir?

j'ai la fonction suivante, essayant d'utiliser des promesses.

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

var definitions = getDefinitions() est de retour:

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

je veux obtenir la valeur de PromiseValue, mais demander pour

var value = definitions.PromiseValue 

me donne un résultat indéfini.

ma question Est de savoir ce que signifient les doubles crochets [[ ]] et comment récupérer la valeur [[PromiseValue]] .

43
demandé sur JLRishe 2015-03-07 18:51:54

5 réponses

Quel est le truc à l'intérieur de [[]]

ma question Est de savoir ce que signifient les crochets doubles [[]], et comment puis-je récupérer la valeur de [PromiseValue]].

C'est une propriété interne. Vous ne pouvez pas y accéder directement. Les promesses natives ne peuvent être déballées que dans then avec des promesses ou de façon asynchrone en général - voir comment retourner la réponse d'un appel asynchrone . Citer la spécification:

ils sont définis par la présente spécification uniquement à des fins d'exposition. Une implémentation D'ECMAScript doit se comporter comme si elle produisait et fonctionnait sur des propriétés internes de la manière décrite ici. les noms des propriétés internes sont placés entre crochets [[]] . Lorsqu'un algorithme utilise une propriété interne d'un objet et que l'objet n'implémente pas la propriété interne indiquée, un L'exception TypeError est lancée.

vous ne pouvez pas

sérieusement si - qu'est-ce qu'ils sont?

très joli! Comme la citation ci-dessus dit qu'ils sont juste utilisés dans le spec - donc, il n'y a aucune raison pour qu'ils apparaissent dans votre console.

ne le dites à personne mais ce sont vraiment symboles privés . La raison pour laquelle ils existent est pour d'autres interne méthodes pour accéder à [[PromiseValue]] . Par exemple quand io.js décide de retourner les promesses au lieu de prendre des callbacks - ceux-ci lui permettraient d'accéder à ces propriétés rapidement dans les cas où il est garanti. Ils sont pas exposés à l'extérieur.

puis-je y accéder?

pas sauf si vous faites votre propre Chrome ou V8 construire. Peut-être dans ES7 avec les modificateurs d'accès, en ce moment il n'y a aucun moyen car ils ne font pas partie de la spécification et briser les navigateurs-désolé.

donc j'ai ma valeur?

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

bien que si je devais deviner - vous êtes ne convertissez pas l'API correctement pour commencer par puisque cette conversion ne fonctionnerait que dans le cas où la méthode est synchrone (dans ce cas ne pas retourner une promesse) ou il retourne une promesse déjà qui le rendra résolu (ce qui signifie que vous n'avez pas besoin de la conversion du tout - juste return .

66
répondu Benjamin Gruenbaum 2017-05-23 10:31:37

j'ai aussi rencontré ce problème aujourd'hui et j'ai trouvé une solution.

ma solution ressemble à ceci:

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

ici, dataWrappedByPromise est une instance Promise . Pour accéder aux données de l'instance Promise , j'ai trouvé que j'avais juste besoin de déballer cette instance avec la méthode .json() .

Espère que ça aide!

9
répondu cafemike 2018-01-03 19:19:39

cet exemple est avec react mais pour la plupart il devrait être le même.

remplacer par .accessoires de jeu.url avec votre url à récupérer pour le faire fonctionner pour la plupart des autres cadres.

Parsing the res.json () retourne le [[promiseValue]] cependant si vous le retournez à un autre .alors() méthode ci-dessous, vous pouvez le retourner comme un tableau total.

let results = fetch(this.props.url)
        .then((res) => {
            return res.json();
        })
        .then((data) => {
            return data;
        })
2
répondu Lachlan Young 2018-03-05 05:49:53

Lire la page de manuel , nous pouvons voir que:

de par sa conception, l'état et la valeur instantanés d'une promesse ne peuvent pas être inspecté de façon synchrone à partir du code, sans appeler la méthode then() .

pour aider au débogage, seulement lors de l'inspection d'un objet de promesse manuellement, vous pouvez voir plus d'informations comme des propriétés particulières qui sont inaccessible à partir du code (ceci, à l'heure actuelle, est mis en œuvre par randomisation le nom de la propriété, le manque de plus sophistiqué de langue ou de débogueur).

c'est moi qui souligne. Par conséquent, ce que vous voulez faire ne peut pas être fait. La meilleure question Est pourquoi avez-vous besoin d'accéder à l'état de promesse comme cela?

0
répondu Nit 2015-03-07 16:15:21

je pense que ça ira bien avec ça.

(async () => {
  let getDefinitions = await ( () => {
    return new Promise( (resolve, reject) => {
      resolve(ContactManager.request("definition:entities"));
    });
  })();
)();
0
répondu Shun ITOH 2016-12-31 14:31:28