Estoy viendo este ejemplo de los documentos de Angular, $qpero 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 promiseBes 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.valueo 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:
promiseALathenfunción devuelve una nueva promesa (promiseB) que se resuelve inmediatamente después de quepromiseAse resuelve, su valor es el valor de lo que se devuelve de la función de éxito dentro depromiseA.En este caso
promiseAse resuelve con un valor,resulty luego se resuelve inmediatamentepromiseBcon el valor deresult + 1.El acceso al valor de
promiseBse realiza de la misma manera que accedimos al resultado depromiseA.Edición de diciembre de 2019 :
async/awaitahora 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,
awaitsolo se puede usar dentro de unaasyncfunció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
thenmé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
.thenfunción de promesa B recibe lo que devuelve.thenfunción de promesa A.aquí la promesa A está regresando es un número, que estará disponible como
numberpará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
promiseBes una promesa, pero se resolverá inmediatamente después de quepromiseAse resuelva. Otra forma de ver esto significa quepromiseA.then()devuelve una promesa asignadapromiseB.Esto significa que el valor que
promiseAresolvió es el valor quepromiseBrecibirá 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
awaitnormalmente devolvería una promesa. Este código se puede pegar en el Node REPL o, si se guarda,index.jsse 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,
connectionpor 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 variableaccountdentro de lathendeclaración.fuente