Estoy viendo 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 promesa A incrementada en 1"?
¿Se supone que debo acceder a eso promiseB.value
o algo así? ¿Cómo puede la devolución de llamada exitosa devolver una promesa Y devolver "resultado + 1"? Me falta algo
javascript
angularjs
promise
angular-promise
nombre_usuario_temporal
fuente
fuente
Respuestas:
promiseA
Lathen
función devuelve una nueva promesa (promiseB
) que se resuelve inmediatamente después de quepromiseA
se resuelve, su valor es el valor de lo que se devuelve de la función de éxito dentro depromiseA
.En este caso
promiseA
se resuelve con un valor,result
y luego se resuelve inmediatamentepromiseB
con el valor deresult + 1
.El acceso al valor de
promiseB
se realiza de la misma manera que accedimos al resultado depromiseA
.Edición de diciembre de 2019 :
async
/await
ahora es estándar en JS, lo que permite una sintaxis alternativa al enfoque descrito anteriormente. Ahora puedes escribir:Ahora no hay promesaB, porque hemos desenvuelto el resultado del uso de la promesaA
await
, y puede trabajar con él directamente.Sin embargo,
await
solo se puede usar dentro de unaasync
función. Entonces, para alejar un poco, lo anterior tendría que estar contenido así:fuente
Cuando una promesa se resuelve / rechaza, llamará a su controlador de éxito / error:
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 promesaA pueden devolver que afectarán el resultado de promesaB:
Armado con esta comprensión, puede dar sentido a lo siguiente:
La llamada entonces devuelve la promesa B inmediatamente. Cuando la promesa A se resuelva, pasará el resultado al controlador de éxito de promesa A. Como el valor de retorno es el resultado de la promesa A + 1, el controlador de éxito devuelve un valor (opción 2 anterior), por lo que la promesa B se resolverá de inmediato, y el controlador de éxito de la promesa B pasará el resultado de la promesa A + 1.
fuente
.then
función de promesa B recibe lo que devuelve.then
función de promesa A.aquí la promesa A está regresando es un número, que estará disponible como
number
parámetro en la función de éxito de la promesa B. que luego se incrementará en 1fuente
Analizar el comentario de manera un poco diferente a su comprensión actual podría ayudar:
Esto indica que
promiseB
es una promesa, pero se resolverá inmediatamente después de quepromiseA
se resuelva. Otra forma de ver esto significa quepromiseA.then()
devuelve una promesa asignadapromiseB
.Esto significa que el valor que
promiseA
resolvió es el valor quepromiseB
recibirá como su valor SuccessCallback:fuente
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 utilizando el siguiente enlace interno node.js no admitido:
ADVERTENCIA: process.binding nunca fue diseñado para usarse fuera del núcleo de nodejs y el equipo central de nodejs está buscando activamente desaprobarlo
https://github.com/nodejs/node/pull/22004 https://github.com/nodejs/node/issues/22064
fuente
Este ejemplo me parece explicativo. Observe cómo la espera espera el resultado y, por lo tanto, pierde la Promesa que se devuelve.
fuente
fuente
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 de WebRTC utilizando un tiempo de espera.
fuente
En el Node REPL, para obtener una conexión de base de datos que era el valor de una promesa, tomé el siguiente enfoque:
La línea con
await
normalmente devolvería una promesa. Este código se puede pegar en el Node REPL o, si se guarda,index.js
se puede ejecutar en Bash conque te deja en el Nodo REPL después de ejecutar el script con acceso a la variable establecida. Para confirmar que la función asincrónica ha regresado, puede iniciar sesión,
connection
por ejemplo, y luego está listo para usar la variable. Por supuesto, uno no querría contar con que la función asincrónica se resuelva aún para cualquier código en el script fuera de la función asincrónica.fuente
Hay una buena respuesta arriba y aquí está la versión de la función de flecha ES6
fuente
Aprendo lentamente las promesas de JavaScript, de forma predeterminada todas las funciones asíncronas devuelven una promesa, puede ajustar su resultado como:
" La expresión de espera hace que la ejecución de la función asíncrona se detenga hasta que se liquide una Promesa (es decir, cumplida o rechazada), y que 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 ".
Lea más sobre la espera y las promesas en MDN Web Docs
fuente
Tal vez este pequeño ejemplo de código mecanografiado ayude.
Aquí el
repository.get(id)
devuelve aPromise<Account>
. Lo asigno a la variableaccount
dentro de lathen
declaración.fuente