Quiero declarar una serie de promesas vacías
luego resolverlos manualmente, pero no funciona?
const tab = [1] let promises = tab.map(e => new Promise(() => { })) setTimeout(() => { promises[0] = Promise.resolve() }, 3000); Promise.all(promises) .then(e => console.log("finished"))NO QUIERO hacerlo así:
const tab = [1] let promises = tab.map(e => new Promise((resolve) => { setTimeout(() => { resolve() }, 3000); })) Promise.all(promises) .then(e => console.log("finished"))Eso es lo más cerca que puedes estar:
const tab = [1] let resolves = [] let promises = tab.map(e => new Promise((resolve) => { resolves.push(resolve) })) setTimeout(() => { resolves[0]() }, 3000); Promise.all(promises).then(e => console.log("finished"))Aquí hay una técnica que usa una función deferred reutilizable que le permite controlar externamente una promesa. Extendemos la funcionalidad de resolve y reject , lo que permite un mejor control para la persona que llama. Este es un patrón algo poco convencional, pero hay ventajas en explotar las promesas de esta manera. Consulte estas preguntas y respuestas para ver un ejemplo detallado:
function deferred () { let resolve, reject, promise = new Promise((res, rej) => { resolve = res; reject = rej }) return { promise, resolve, reject } } const tasks = [ deferred(), deferred(), deferred() ] // 3 "deferrred" objects Promise.all(tasks.map(t => t.promise)).then(console.log, console.error) setTimeout(_ => tasks[0].resolve("one"), 1000) setTimeout(_ => tasks[1].resolve("two"), 2000) setTimeout(_ => tasks[2].resolve("three"), 3000)