Resultado: a , b , d , c . Esperado: a , b , c , d
const promises = [] console.log('a') someFunc(promises) Promise.allSettled(promises).then(() => console.log('d')) function someFunc(promises) { const promise = new Promise(resolve => setTimeout(() => { console.log('b') const promise2 = new Promise(resolve2 => setTimeout(() => { console.log('c') resolve2() }, 3000)) promises.push(promise2) resolve() }, 3000)) promises.push(promise) return promise }Si bien sería posible parchearlo no empujando a una matriz, sino haciendo que cada Promesa se someFunc entre sí en alguna Función ...
console.log('a') someFunc().then(() => console.log('d')) function someFunc() { return new Promise(resolve => setTimeout(() => { console.log('b') new Promise(resolve2 => setTimeout(() => { console.log('c') resolve2() }, 3000)) .then(resolve); }, 3000)) } Una versión mucho más comprensible prometería setTimeout para empezar en lugar de hacerlo cada vez.
const setTimeoutPromise = ms => new Promise(resolve => setTimeout(resolve, ms)); console.log('a') someFunc().then(() => console.log('d')) function someFunc() { return setTimeoutPromise(3000) .then(() => { console.log('b'); return setTimeoutPromise(3000) }) .then(() => { console.log('c'); return setTimeoutPromise(3000) }); } Que se puede simplificar aún más con await ...
const setTimeoutPromise = ms => new Promise(resolve => setTimeout(resolve, ms)); console.log('a') someFunc().then(() => console.log('d')) async function someFunc() { await setTimeoutPromise(3000); console.log('b'); await setTimeoutPromise(3000); console.log('c'); await setTimeoutPromise(3000); }Sé que puede estar confundido con esta pregunta mucho. Aquí está la solución que encontré
const promises = [] const timeout = ms => { const promise = new Promise(resolve => setTimeout(resolve, ms)) promises.push(promise) return promise } const someFunc = () => timeout(1000).then(() => { console.log('b') timeout(1000).then(() => console.log('c')) }) async function main() { console.log('a') someFunc() let i = 0; while (promises.length > i) { i = promises.length await Promise.allSettled(promises) } console.log('d') } main() El problema que realmente quiero expresar es que el contenido de la función someFunc no se determina en el momento de la compilación, mientras que necesito asegurarme de que la función no deje efectos secundarios una vez ejecutada.