Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

203
Vistas
¿Cómo retener los valores de la matriz dentro del bucle asíncrono? javascript

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 []
about 4 years ago · Juan Pablo Isaza
2 Respuestas
Responde la pregunta

0

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)
about 4 years ago · Juan Pablo Isaza Denunciar

0

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.

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda