Estoy trabajando en un código Javascript que se ve así:
const arrayOfPromises = getArrayOfPromises(); Promise.all(arrayOfPromises).then(array => doStuff(array)); Necesito cambiar getArrayOfPromises() para devolver información sobre cada promesa; para simplificar, digamos que es un indicador simple de verdadero/falso para cada una. Mi primer instinto fue refactorizar esta función para devolver una matriz de objetos, por ejemplo:
const getArrayOfObjects = () => { ... return [ { promise: promise1, flag: flag1 }, { promise: promise2, flag: flag2 }, ... { promise: promisen, flag: flagn } ]; } Sin embargo, lo anterior no funcionaría con Promise.all porque solo funciona directamente con una iteración de objetos Promise sin los objetos envolventes en el medio.
¿Cuál es la forma más sencilla de proporcionar dichos metadatos para cada una de las promesas y luego trabajar con ellos una vez que se hayan resuelto todas las promesas?
Si desea utilizar estos metadatos una vez que se hayan resuelto las promesas y no tiene ningún control sobre los valores que están siendo resueltos por las promesas devueltas por getArrayOfPromises() , simplemente puede llamar a then() en cada promesa por separado en la matriz y hacer que devuelva el valor original combinado con sus metadatos. Aunque asegúrese de reemplazar la promesa original con la promesa devuelta por .then() . Array.prototype.map() lo hace fácil:
arrayOfPromises = arrayOfPromises.map(promise => promise.then(value => ({ value, flag: true })));Ejemplo:
let arrayOfPromises = getArrayOfPromises(); arrayOfPromises = arrayOfPromises.map(promise => promise.then(value => ({ value, flag: true }))); Promise.all(arrayOfPromises).then(array => doStuff(array)); function getArrayOfPromises() { return [sleep(1000), sleep(1500), sleep(2000)]; } function doStuff(array) { console.log(array); } function sleep(ms) { return new Promise(resolve => setTimeout(() => resolve('resolved after ' + ms), ms)); } Si tiene control sobre lo que devuelve getArrayOfPromises() , simplemente devuelva los metadatos como parte del valor que se está resolviendo.
¿Cuál es la forma más sencilla de proporcionar dichos metadatos para cada una de las promesas y luego trabajar con ellos una vez que se hayan resuelto todas las promesas?
Simplemente coloque los datos en cada valor de resultado. No se trata de metadatos sobre la promesa, sino sobre el valor (?), y no necesita trabajar con ellos hasta que se resuelvan todas las promesas, por lo que los resultados son el lugar perfecto. Las banderas simplemente se convierten en contenido de la array en la que Promise.all(…) .