Tengo una serie de objetos que necesitan datos de una llamada API.
El punto final de API es diferente para cada objeto.
Estoy iterando la matriz de objetos y creando una promesa para cada uno.
Luego estoy usando Promise.all pasando una serie de promesas.
Una vez que se han resuelto las promesas, necesito actualizar la matriz original de objetos con sus respectivos datos. Para evitar iterar la matriz de objetos dos veces, estoy asignando (a falta de una palabra mejor) el resultado de entonces en la Promesa antes de que se resuelva.
Funciona, pero ¿hay algún problema con este enfoque?
updateData = async (objects) => { const promises = []; objects.forEach(object => { if (object.data === undefined) { const service = this.serviceFactory.getService(object.serviceKey); promises.push(service[object.serviceFunc](object.id).then(data => object.data = data)); } }); await Promise.all(promises); };
No, todo está bien, pero lo animo a usar async/await para la implementación completa. Algo como esto:
const processObject = async (object) => { if (object.data === undefined) { const service = this.serviceFactory.getService(object.serviceKey); const data = await service[object.serviceFunc](object.id); object.data = data } return object; } updateData = async (objects) => { const promises = objects.map(processObject); const processedObjects = await Promise.all(promises); };
Funciona, pero ¿hay algún problema con este enfoque?
El código que se muestra en sí está bien, si esto podría tener una trampa depende más del lado de la llamada (cómo maneja los datos de updateData
y si está claro que los objetos pasados a la función se actualizan).
Con respecto al código en sí: probablemente usaría un map
en su lugar para cada uno, lo await
forEach
de esa devolución de llamada, y lo hace un poco menos propenso a errores con respecto a romper accidentalmente la cadena Promise dentro de la devolución de llamada.
updateData = async(objects) => { const promises = objects.map(async (object) => { if (object.data === undefined) { const service = this.serviceFactory.getService(object.serviceKey); object.data = await service[object.serviceFunc](object.id); } }); await Promise.all(promises); };
En el caso de que object.data === undefined
sea falso, el valor devuelto es undefined
, pero eso no es un problema.