Desafortunadamente, no he estado trabajando con Typescript y GraphQL en combinación por mucho tiempo.
El problema que no puedo resolver es que tengo una matriz de objetos y quiero hacer una mutación de GraphQL con cada uno de ellos.
La matriz se ve así:
(3) [{…}, {…}, {…}] 0: {__typename: 'user', id: '8', name: 'Tom', status: 'active', model: '11045779', …} 1: {__typename: 'user', id: '7', name: 'Mike', status: 'active', model: 'SIJY_B_3', …} 2: {__typename: 'user', id: '5', name: 'Peter', status: 'active', model: 'VS247HR', …}Quiero realizar la siguiente función con cada objeto en la matriz:
async function updateUser(values: ValuesType) { await updateUser({ variables: { id: values.user.id, status: "inactive", }, }); }Con objetos individuales, puedo usar la función sin ningún problema, pero desafortunadamente no he encontrado una manera de iterar sobre una matriz con ella.
La respuesta es probablemente simple, pero de alguna manera ninguno de mis intentos tuvo éxito.
¿Existe una solución simple para ejecutar esta función con cada objeto en la matriz?
Promise.all o Promise.allSettled son enfoques idiomáticos para esperar varias funciones async a la vez. Estas funciones javascript estándar toman una serie de Promesas y devuelven una serie de resultados.
El patrón funciona para todas las funciones asíncronas. No es específico de GraphQL. patio de recreo aquí
// sample type interface ValuesType { id: String name: String status: String model: String } // sample data const updates: ValuesType[] = [{id: '8', name: 'Tom', status: 'active', model: '11045779'}, {id: '7', name: 'Mike', status: 'active', model: 'SIJY_B_3'}, {id: '5', name: 'Peter', status: 'active', model: 'VS247HR'}] // a mock update function - with delay to simulate the GraphQL network call async function updateUser(values: ValuesType): Promise<String> { return new Promise<String>((resolve) => setTimeout(()=> resolve(values.id), 300)) } // the important stuff - run the 3 mutations at once (async ()=> { // Option 1: Promise.all const all = await Promise.all(updates.map(updateUser)) console.log('Promise.All result', all) // ["8", "7", "5"] // Option 2: Promise.allSettled const allSettled = await Promise.allSettled(updates.map(updateUser)) console.log('Promise.AllSettled result', allSettled) // [{"status": "fulfilled", "value": "8"} ...] })()