Js no es mi primer idioma, por mucho. Codifico en 5 o 6 más, y me siento cómodo con las devoluciones de llamadas, lo que significa que debería poder asimilar las promesas.
Sin embargo, heredé un proyecto node.js con algo como esto (simplificado), lo que me hace dudar)
let promise = someFunction.then({return xxxx;}); // lots of more code & promises Promises.all().then(() => {return somethingElse}); Me siento cómodo con muchas promesas y Promises.all() para await a que se resuelvan todas (aunque estoy reemplazando all .then con .then por un código más limpio), PERO ...
que return dentro de un .then me inquieta. Si lo entiendo correctamente, .then simplemente envuelve una devolución de llamada asíncrona, lo que podría ocurrir en cualquier momento, incluso antes que el resto del código y Promises.all , dejando parte del código sin ejecutar.
¿Estoy en lo correcto al estar preocupado, o hay algo que me estoy perdiendo?
Tl;dr: ¿está bien regresar dentro de un .then ?
Volver adentro .then es extremadamente común y está bien hacerlo. Lo que hace es generar una Promesa que ahora se resuelve en el valor devuelto (en lugar del valor devuelto por la Promesa anterior). Ejemplo:
// resolves to 1 const prom1 = Promise.resolve(1); // chains off of prom1, resolves to 2 const prom2 = prom1.then(() => { return 2; }); prom1.then(console.log); setTimeout(() => { prom2.then(console.log); }); Esta técnica es muy útil cuando necesita pasar un valor de un .then anterior a un .then posterior.
const makeApiCall = num => Promise.resolve(num + 3); Promise.resolve(1) .then((result1) => { return makeApiCall(result1); }) .then((result2) => { console.log(result2); });Qué hará la devolución en su situación específicamente:
let promise = someFunction.then({return xxxx;}); // lots of more code & promises Promises.all().then(() => {return somethingElse}); Si se pasa la promise a Promise.all , entonces su valor de resolución será xxxx , en lugar de lo que alguna someFunction resuelva. (Si Promise.all 's .then ignora su argumento, entonces no hace nada excepto esperar a que se resuelva el valor devuelto, si es una Promesa).
const someFunction = () => Promise.resolve(1); let promise = someFunction().then(() => { return 'xxxx'; }); Promise.all([promise]).then((allResults) => { console.log('allResults', allResults); return 'somethingElse'; }) .then((result2) => { console.log('Next `.then`', result2); });Tenga en cuenta que su código actual tiene una serie de problemas de sintaxis que debe corregir.