Tengo un código a continuación que usa api para obtener datos del cliente. El problema es que cuando el ciclo pasó al segundo índice, los ID de customerIds conservan el valor del index anterior (consulte el registro de la consola a continuación).
¿Alguien sabe cómo lograr esto correctamente?
Aquí está mi código
let customerIds = []; arrayChunks.forEach(async (chunkGroupIds, index) => { try { console.log('customerIds - before', index, customerIds) const checkStatusResult = await checkStatus( token, chunkGroupIds ) chunkGroupIds.map((customerId) => { const found = checkStatusResult.response.data.find( (data) => customerId.toString() === data.customerId ) if (found) { customerIds = [...customerIds, customerId] } }) console.log('customerIds - after', index, customerIds) } catch (error) { ... } }) console.log('customerIds - final', customerIds)Registros de la consola: el problema se puede mostrar mediante el texto que se está imprimiendo. Como podemos ver, cuando pasó al segundo índice, no obtuvo el valor anterior del índice uno.
customerIds - before 0 [] customerIds - after 0 [2,3,5] customerIds - before 1 [] customerIds - after 1 [] ... and so on customerIds - final []Use for of loop en lugar del enfoque de devolución de llamada
let customerIds = []; let index = 0; for (const chunkGroupIds of arrayChunks) { try { console.log('customerIds - before', index, customerIds) const checkStatusResult = await checkStatus( token, chunkGroupIds ) chunkGroupIds.map((customerId) => { const found = checkStatusResult.response.data.find( (data) => customerId.toString() === data.customerId ) if (found) { customerIds.push(customerId); } }) console.log('customerIds - after', index, customerIds) } catch (error) { ... } finally { index++; } } console.log('customerIds - final', customerIds)Esto parece ser un problema de asincronismo, puede parecer que las promesas en la matriz se ejecutan secuencialmente, pero no es así. En el bucle forEach , todos se ejecutan simultáneamente.
Esto podría ser algo bueno en su caso, ya que no tiene que esperar la suma del tiempo secuencial, donde probablemente tenga problemas es en la parte final donde desea ver la matriz final con todos los valores adjuntos, para esto Recomiendo lo siguiente:
const promises = arrayChunks.map(async (chunkGroupIds, index) => { try { console.log('customerIds - before', index, customerIds) const checkStatusResult = await checkStatus( token, chunkGroupIds ) chunkGroupIds.map((customerId) => { const found = checkStatusResult.response.data.find( (data) => customerId.toString() === data.customerId ) if (found) { customerIds = [...customerIds, customerId] } }) console.log('customerIds - after', index, customerIds) } catch (error) { ... } }) await Promise.all(promises); // Wait until all of them are finished console.log('customerIds - final', customerIds) Aquí, la utilidad Promise.all le permite esperar hasta que finalice una colección de promesas, las funciones se asignan automáticamente a una promesa gracias a la palabra clave async .
En caso de que necesite que sus promesas se ejecuten secuencialmente, puede utilizar el enfoque recomendado por @amir-saleem. De lo contrario, mi sugerencia sería mejor en términos de rendimiento.