Estoy mirando este ejemplo de los documentos de Angular, $q
pero creo que esto probablemente se aplica a las promesas en general. El siguiente ejemplo se copia literalmente de sus documentos con su comentario incluido:
promiseB = promiseA.then(function(result) {
return result + 1;
});
// promiseB will be resolved immediately after promiseA is resolved and its value
// will be the result of promiseA incremented by 1
No tengo claro cómo funciona esto. Si puedo invocar .then()
el resultado del primero .then()
, encadenándolos, lo que sé que puedo, entonces promiseB
es un objeto de promesa, de tipo Object
. No es un Number
. Entonces, ¿qué quieren decir con "su valor será el resultado de la promesaA incrementada en 1"?
¿Se supone que debo acceder a eso como promiseB.value
o algo así? ¿Cómo puede la devolución de llamada exitosa devolver una promesa Y devolver "resultado + 1"? Me estoy perdiendo algo.
promiseA
La then
función devuelve una nueva promesa ( promiseB
) que se resuelve inmediatamente después de que promiseA
se resuelve, su valor es el valor de lo que devuelve la función de éxito dentro promiseA
.
En este caso, promiseA
se resuelve con un valor result
y luego se resuelve inmediatamente promiseB
con el valor de result + 1
.
Acceder al valor de promiseB
se realiza de la misma forma que accedimos al resultado de promiseA
.
promiseB.then(function(result) {
// here you can use the result of promiseB
});
Editar diciembre de 2019 : async
/ await
ahora es estándar en JS, lo que permite una sintaxis alternativa al enfoque descrito anteriormente. Ahora puedes escribir:
let result = await functionThatReturnsPromiseA();
result = result + 1;
Ahora no hay promesaB, porque hemos desenvuelto el resultado del uso de promiseA await
y puede trabajar con él directamente.
Sin embargo, await
solo se puede usar dentro de una async
función. Entonces, para alejar un poco, lo anterior debería estar contenido así:
async function doSomething() {
let result = await functionThatReturnsPromiseA();
return result + 1;
}
Cuando una promesa se resuelve / rechaza, llamará a su controlador de éxito / error:
var promiseB = promiseA.then(function(result) {
// do something with result
});
El then
método también devuelve una promesa: promiseB, que se resolverá / rechazará según el valor de retorno del controlador de éxito / error de promiseA .
Hay tres valores posibles que los controladores de éxito / error de promiseA pueden devolver y que afectarán el resultado de promiseB:
1. Return nothing --> PromiseB is resolved immediately,
and undefined is passed to the success handler of promiseB
2. Return a value --> PromiseB is resolved immediately,
and the value is passed to the success handler of promiseB
3. Return a promise --> When resolved, promiseB will be resolved.
When rejected, promiseB will be rejected. The value passed to
the promiseB's then handler will be the result of the promise
Armado con este entendimiento, puede entender lo siguiente:
promiseB = promiseA.then(function(result) {
return result + 1;
});
La llamada then devuelve promesaB inmediatamente. Cuando se resuelve promiseA, pasará el resultado al controlador de éxito de promiseA. Dado que el valor devuelto es el resultado de la promesa A + 1, el controlador de éxito está devolviendo un valor (opción 2 anterior), por lo que promesaB se resolverá de inmediato y el controlador de éxito de la promesaB pasará al resultado de la promesa A + 1.
.then
función de promesaB recibe lo que se devuelve de .then
función de promesaA.
aquí, la promesaA está regresando es un número, que estará disponible como number
parámetro en la función exitosa de la promesaB. que luego se incrementará en 1
Analizar el comentario de manera un poco diferente a su comprensión actual podría ayudar:
// promiseB will be resolved immediately after promiseA is resolved
Esto establece que promiseB
es una promesa pero que se resolverá inmediatamente después de que promiseA
se resuelva. Otra forma de ver esto significa que promiseA.then()
devuelve una promesa asignada promiseB
.
// and its value will be the result of promiseA incremented by 1
Esto significa que el valor que se promiseA
resolvió es el valor que promiseB
recibirá como su valor successCallback:
promiseB.then(function (val) {
// val is now promiseA's result + 1
});
La respuesta de pixelbits es correcta y siempre debe usarla .then()
para acceder al valor de una promesa en el código de producción.
Sin embargo, hay una forma de acceder al valor de la promesa directamente después de que se haya resuelto mediante el siguiente enlace interno node.js no compatible:
process.binding('util').getPromiseDetails(myPromise)[1]
ADVERTENCIA: process.binding nunca estuvo destinado a usarse fuera del núcleo de nodejs y el equipo central de nodejs está buscando activamente desaprobarlo
Este ejemplo me resulta autoexplicativo. Observe cómo await espera el resultado y, por lo tanto, se pierde la devolución de la Promesa.
cryA = crypto.subtle.generateKey({name:'ECDH', namedCurve:'P-384'}, true, ["deriveKey", "deriveBits"])
Promise {<pending>}
cryB = await crypto.subtle.generateKey({name:'ECDH', namedCurve:'P-384'}, true, ["deriveKey", "deriveBits"])
{publicKey: CryptoKey, privateKey: CryptoKey}
Hay una buena respuesta arriba y aquí está la versión de la función ES6 Arrow
var something = async() => {
let result = await functionThatReturnsPromiseA();
return result + 1;
}
promiseA(pram).then(
result => {
//make sure promiseA function allready success and response
//do something here
}).catch(err => console.log(err)) => {
// handle error with try catch
}
Puede hacerlo fácilmente utilizando un método de espera asíncrono en javascript.
A continuación se muestra un ejemplo de recuperación de un valor de promesa WebRTC utilizando un tiempo de espera.
function await_getipv4(timeout = 1000) {
var t1 = new Date();
while(!window.ipv4) {
var stop = new Date() - t1 >= timeout;
if(stop) {
console.error('timeout exceeded for await_getipv4.');
return false;
}
}
return window.ipv4;
}
function async_getipv4() {
var ipv4 = null;
var findIP = new Promise(r=>{var w=window,a=new (w.RTCPeerConnection||w.mozRTCPeerConnection||w.webkitRTCPeerConnection)({iceServers:[]}),b=()=>{};a.createDataChannel("");a.createOffer(c=>a.setLocalDescription(c,b,b),b);a.onicecandidate=c=>{try{c.candidate.candidate.match(/([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/g).forEach(r)}catch(e){}}})
findIP.then(ip => window.ipv4 = ip);
return await_getipv4();
};
En Node REPL, para obtener una conexión de base de datos que fuera el valor de una promesa, tomé el siguiente enfoque:
let connection
try {
(async () => {
connection = await returnsAPromiseResolvingToConnection()
})()
} catch(err) {
console.log(err)
}
La línea con await
normalmente devolvería una promesa. Este código se puede pegar en Node REPL o, si se guarda en index.js
él, se puede ejecutar en Bash con
node -i -e "$(< index.js)"
lo que lo deja en el Nodo REPL después de ejecutar el script con acceso a la variable set. Para confirmar que la función asincrónica ha regresado, puede iniciar sesión, connection
por ejemplo, y luego estará listo para usar la variable. Por supuesto, uno no querría contar con que la función asincrónica se resolviera todavía para cualquier código en el script fuera de la función asincrónica.
Soy un aprendiz lento de las promesas de JavaScript, de forma predeterminada, todas las funciones asíncronas devuelven una promesa, puede ajustar su resultado como:
(async () => {
//Optional "await"
await yourAsyncFunctionOrPromise()
.then(function (result) {
return result +1;
})
.catch(function (error) {
return error;
})()
})
" La expresión de espera hace que la ejecución de la función asíncrona se detenga hasta que se establezca una promesa (es decir, se cumpla o rechace) y reanude la ejecución de la función asíncrona después del cumplimiento. Cuando se reanuda, el valor de la expresión de espera es el de la promesa cumplida . Si se rechaza la Promesa, la expresión de espera arroja el valor rechazado ".
Kristen Stewart una vez le dio un fuerte puñetazo a su coprotagonista de 'Blancanieves', Chris Hemsworth, que fue un ataque que el actor no vio venir.
En una entrevista con la revista GQ, Jin de BTS reveló que una parte de la canción de BTS y Coldplay 'My Universe' no 'llegó al corte final'.
'Scream' establece un regreso sangriento que provoca algunas nuevas direcciones, pero la nueva ola de asesinatos de Ghostface no es tan profunda como debería.
Tessa Thompson interpreta a Valkyrie en el MCU. Su personaje recibió el título de 'rey' antes que 'Thor: Love and Thunder', ¿o no?
¡Nuestro mini crucigrama actualizado semanalmente combina nuestras lecturas favoritas de HowStuffWorks con pistas inteligentes!
Lavar la ropa ya es bastante malo sin tener que preocuparse por elegir el detergente adecuado. Entonces, ¿cuál es mejor? ó acaso importa?
Las familias Fugate y Combs en la zona rural de Kentucky perdieron la lotería genética, y ambos compartían un rasgo recesivo raro que hacía que su piel se viera azul cuando se casaron. ¿Cuál fue la causa de esto? ¿Y qué pasó con las familias?
Se están criando dos polluelos sin padre en un programa para salvar al cóndor de California de la extinción. ¿Cómo son posibles estos nacimientos 'vírgenes'?
La estrella de Vanderpump Rules, Katie Maloney-Schwartz, habló sobre el progreso que ha logrado en su viaje de amor propio en una publicación honesta y sincera en Instagram el jueves.
Jessica Alba compartió un encantador video en su Instagram que la muestra a ella y a sus hijos acurrucándose y jugando con los dos perros llamados Dolly y Lucy.
"Fue una situación de amor a primera vista", le dice una fuente a PEOPLE sobre Megan Fox y Machine Gun Kelly, quienes se comprometieron el fin de semana pasado durante unas vacaciones en Puerto Rico.
Según la policía, Devonne Marsh supuestamente cubrió a su novia, que no ha sido identificada, con líquido para encendedores y encendió las llamas.
The Modern Survival Guide # 48 Esta es la Modern Survival Guide, una guía que estoy escribiendo sobre cosas que creo que la gente necesita saber sobre la vida en el mundo moderno. Las opiniones expresadas aquí son mías y solo mías.
El guión original de Julia Hart "The Keeping Room" la puso en la Lista Negra en 2012. La película está en preproducción protagonizada por Olivia Wilde, Hailee Steinfeld y Nicole Beharie, dirigida por Daniel Barber.
Caminas por una ciudad en la noche para llenar tu estómago hambriento ya que no comiste nada excepto desde el almuerzo. Miras la luz de las lámparas que, si bien no la hacen tan brillante como el día, son lo suficientemente brillantes como para hacerte entrecerrar los ojos.