Estoy recorriendo los identificadores que lo envían a una función asíncrona y quiero devolver datos exitosos y fallidos, en este momento solo estoy devolviendo datos exitosos
const successContractSignature: LpContractSla[] = []; for (const id of lpContractSlaIds) { const data = await createLpSignature(context, id); if (data) { successContractSignature.push(data); } } return successContractSignature;Si createLpSignature arroja un error, ¿necesito intentarlo aquí? pero eso no saldría del bucle? ¿Cómo puedo enviar datos fallidos a una matriz separada sin interrumpir el ciclo?
A menos que haya una razón específica para evitar la llamada en paralelo, siempre es una buena práctica evitar iniciar llamadas asíncronas en un bucle for con espera, ya que esperará a que se resuelva (o rechace) cada promesa antes de ejecutar la siguiente. . Este es un patrón mejor que le permite obtener también todos los resultados de las promesas, ya sea que se hayan resuelto o rechazado:
const successContractSignature: LpContractSla[] = await Promise.allSettled(lpContractSlaIds.map((id: string) => createLpSignature(context,id))) return successContractSignature;Pero si por alguna razón en particular necesita hacer estas llamadas en una secuencia y no en paralelo, puede envolver la llamada única en un bloque de captura de prueba, que no saldrá del bucle:
for (const id of lpContractSlaIds) { let data; try { data = await createLpSignature(context, id); } catch(e) { data = e } if (data) { successContractSignature.push(data); } }Puedes probarlo en este ejemplo:
const service = (id) => new Promise((res, rej) => setTimeout( () => (id %2 === 0 ? res("ID: "+id) : rej('Error ID : '+id)), 1000 ) ); const ids = [1,2,3,4,5] const testParallelService = async () => { try { const data = await Promise.allSettled(ids.map(id => service(id))) return data.map(o => `${o.status}: ${o.reason ?? o.value}`) } catch(e) { console.log(e) } } testParallelService().then(data => console.log("Parallel data: ", data)) const testSequentialService = async () => { const res = []; for (const id of ids) { let data; try { data = await service(id); } catch (e) { data = e; } if (data) { res.push(data); } } return res; }; testSequentialService().then((data) => console.log('Sequential Data: ', data));