En el siguiente código:
new Promise((resolve, reject) => { asyncFunc1(resolve,reject); }) .then((result) => { // do then1 stuff }) new Promise((resolve, reject) => { asyncFunc2(resolve,reject); }) .then((result) => { // do then2 stuff }) ¿Se asyncFunc1() de .then() antes de que se asyncFunc2() ?
¿O ambos se ejecutarán (casi) simultáneamente, y sus then() se ejecutarán justo cuando regresen?
Si el segundo no espera al primero, ¿hay alguna forma de hacerlo que no sea mover asyncFunc2() a asyncFunc1() 's .then() ?
Ambas promesas se ejecutarán (casi) simultáneamente, porque ese es exactamente uno de los puntos fuertes de Javascript: debido a su diseño basado en devolución de llamadas, puede iniciar y esperar muchas funciones asincrónicas (en forma de promesas) en paralelo, sin la necesidad de que el desarrollador se preocupe por el manejo complejo de subprocesos o algo por el estilo.
Si desea que asyncFunc2 espere a que se complete asyncFunc1 , debe colocarse dentro del bloque " then " de asyncFunc1 .
Puede verlo fácilmente y probarlo simulando dos funciones que toman un tiempo definido (usando setTimeout), por ejemplo:
function resolveAfter2Seconds() { return new Promise(resolve => { setTimeout(() => { resolve('resolved at ' + new Date().toISOString()); }, 2000); }); } function resolveAfter3Seconds() { return new Promise(resolve => { setTimeout(() => { resolve('resolved at ' + new Date().toISOString()); }, 3000); }); } function execPromises() { console.log('calling at ' + new Date().toISOString()); resolveAfter2Seconds().then(result => console.log(result)); resolveAfter3Seconds().then(result => console.log(result)); } execPromises();Verá en la salida de la consola que el primero terminará 2 segundos después de iniciar el script, el otro 3 segundos después de iniciar el script (y no después de 2 + 3 = 5 segundos).
Si desea hacer que asyncFunc2 espere a asyncFunc1 sin necesidad de then , puede usar las palabras clave async / await .
En mi ejemplo, la función execPromises se vería así ( asyncFunc2 ejecutado después de completar asyncFunc1 !):
async function execPromises() { console.log('calling at ' + new Date().toISOString()); const resultA = await resolveAfter2Seconds(); console.log(resultA); const resultB = await resolveAfter3Seconds(); console.log(resultB); }