Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

206
Visualizações
¿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 Respostas
Responde à pergunta

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda