Tengo la siguiente función que usa Promise .
var getDefinitions = function() { return new Promise(function(resolve) { resolve(ContactManager.request("definition:entities")); }); } var definitions = getDefinitions() El contenido de las definitions es:
Promise { [[PromiseStatus]]: "resolved", [[PromiseValue]]: child } Acceder a la propiedad PromiseValue directamente devuelve indefinido
var value = definitions.PromiseValue; // undefined ¿Qué significan los corchetes dobles [[ ]] y cómo recupero el valor de [[PromiseValue]] .
[[]]Mi pregunta es qué significan los corchetes dobles [[ ]] y cómo recupero el valor de [[PromiseValue]].
Es una propiedad interna. No se puede acceder directamente. Las promesas nativas solo se pueden then con promesas o de forma asíncrona en general; consulte Cómo devolver la respuesta de una llamada asíncrona . Citando la especificación:
Están definidos por esta especificación puramente con fines expositivos. Una implementación de ECMAScript debe comportarse como si produjera y operara con propiedades internas de la manera descrita aquí. Los nombres de las propiedades internas se encierran entre corchetes dobles [[ ]] . Cuando un algoritmo usa una propiedad interna de un objeto y el objeto no implementa la propiedad interna indicada, se lanza una excepción TypeError.
No se puede
¡Muy agradable! Como dice la cita anterior, solo se usan en la especificación, por lo que no hay razón para que aparezcan realmente en su consola.
No se lo digas a nadie, pero estos son símbolos realmente privados . La razón por la que existen es para que otros métodos internos puedan acceder a [[PromiseValue]] . Por ejemplo, cuando io.js decide devolver promesas en lugar de aceptar devoluciones de llamada, esto le permitiría acceder a estas propiedades rápidamente en los casos en que esté garantizado. No están expuestos al exterior.
No, a menos que haga su propia compilación de Chrome o V8. Tal vez en ES7 con modificadores de acceso. A partir de ahora, no hay forma, ya que no son parte de la especificación y se romperán entre los navegadores, lo siento.
getDefinitions().then(function(defs){ //access them here }); .catch(function(defs){ //access them here }); Aunque si tuviera que adivinar, para empezar, no está convirtiendo la API correctamente, ya que esta conversión solo funcionaría en caso de que el método sea síncrono (en ese caso, no devuelva una promesa) o ya devuelva una promesa que hará se resolvió (lo que significa que no necesita la conversión en absoluto, solo return .
También entré en este problema hoy y encontré una solución.
Mi solución se ve así:
fetch('http://localhost:3000/hello') .then(dataWrappedByPromise => dataWrappedByPromise.json()) .then(data => { // you can access your data here console.log(data) }) Aquí, dataWrappedByPromise es una instancia de Promise . Para acceder a los datos en la instancia de Promise , descubrí que solo necesitaba desenvolver esa instancia con el método .json() .
¡Espero que ayude!
Este ejemplo es con reaccionar, pero en su mayor parte debería ser lo mismo.
Reemplace this.props.url con su URL para buscar y hacer que funcione para la mayoría de los otros marcos.
Analizar el res.json() devuelve el [[promiseValue]]; sin embargo, si luego lo devuelve a otro método .then() a continuación, puede devolverlo como una matriz total.
let results = fetch(this.props.url) .then((res) => { return res.json(); }) .then((data) => { return data; })