O que ] significa no console do javascript e como obtê-lo

Eu tenho a seguinte function, tentando usar promises.

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

var definitions = getDefinitions() está retornando:

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

Eu quero obter o valor de PromiseValue, mas pedindo

 var value = definitions.PromiseValue 

me dá um resultado indefinido.

Minha pergunta é o que significam os colchetes duplos [[ ]] e como recupero o valor de [[PromiseValue]] .

Qual é o material dentro de [[]]

Minha pergunta é o que significam os colchetes duplos [[]] e como recupero o valor de [[PromiseValue]].

É uma propriedade interna. Você não pode acessá-lo diretamente. As promises nativas só podem ser desdobradas then com promises ou assincronamente em geral – consulte Como retornar a resposta de uma chamada assíncrona . Citando a especificação:

Eles são definidos por essa especificação apenas para fins expositivos. Uma implementação do ECMAScript deve se comportar como se produzisse e operasse sobre propriedades internas da maneira descrita aqui. Os nomes das propriedades internas são colocados entre colchetes duplos [[]] . Quando um algoritmo usa uma propriedade interna de um object e o object não implementa a propriedade interna indicada, uma exceção TypeError é lançada.

Você não pode

Seriamente embora – o que são eles?

Muito agradável! Como a citação acima diz, elas são usadas apenas na especificação – por isso não há motivo para elas realmente aparecerem no seu console.

Não conte a ninguém, mas estes são símbolos realmente privados . A razão pela qual eles existem é que outros methods internos podem acessar [[PromiseValue]] . Por exemplo, quando o io.js decide retornar promises ao invés de receber callbacks – estes permitiriam que ele acesse essas propriedades rapidamente nos casos em que ele é garantido. Eles não estão expostos ao exterior.

Posso acessá-los?

Não, a menos que você crie seu próprio Chrome ou V8. Talvez no ES7 com modificadores de access, no momento não há nenhuma maneira como eles não fazem parte da especificação e vão quebrar os navegadores – desculpe.

Então eu recebo meu valor?

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

Embora se eu tivesse que adivinhar – você não está convertendo a API corretamente para começar, uma vez que essa conversão só funcionaria caso o método fosse síncrono (nesse caso não retorne uma promise) ou ele retornará uma promise que já fará resolveu (o que significa que você não precisa da conversão), apenas return .

Eu também entrei neste problema hoje e encontrei uma solução.

Minha solução é assim:

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

Aqui, dataWrappedByPromise é uma instância do Promise . Para acessar os dados na instância do Promise , descobri que precisava apenas desdobrar essa instância com o método .json() .

Espero que ajude!

Este exemplo é com reagir mas na maior parte deve ser o mesmo.

Substitua this.props.url pela sua URL para buscar para que funcione na maioria das outras estruturas.

Analisando o res.json () retorna o [[promiseValue]] no entanto, se você, em seguida, devolvê-lo para outro método. Then () abaixo, você pode retorná-lo como um array total.

 let results = fetch(this.props.url) .then((res) => { return res.json(); }) .then((data) => { return data; }) 

Lendo a manpage , podemos ver que:

Por design, o estado instantâneo e o valor de uma promise não podem ser inspecionados de forma síncrona a partir do código, sem chamar o método then() .

Para ajudar na debugging, apenas ao inspecionar um object de promise manualmente, você pode ver mais informações como propriedades especiais inacessíveis do código (isso, no momento, é implementado pela randomização do nome da propriedade, pela falta de suporte mais sofisticado ao idioma ou ao depurador). ).

Ênfase minha. Portanto, o que você quer fazer não pode ser feito. A melhor pergunta é por que você precisa acessar o estado de promise assim?

Eu acho que vai bem com isso.

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