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

110
Visualizações
Promise.all frente a foreach Promise

Tengo una aplicación de calculadora angular que calcula algunos resultados ( CalculatorResult ) agrupados en hojas (como las de Excel ). Digamos que tenemos unas seis hojas.

Tengo un método, calculateSheet , que toma algunas propiedades, el nombre de la hoja y devuelve algunos CalculatorResult[] :

 async calculateSheet( propertyValues: PropertyValue[], sheetTypeName: string): Promise<CalculatorResult[]>

El método calculateSheets que calcula las seis hojas, debe calcular cada una de las seis hojas y luego agregar todas las matrices resultantes del resultado en una sola matriz (seis matrices de CalculatorResult deben convertirse en una sola).

Entonces, probé dos métodos para agregarlo, a continuación:

 // define all promises to be calculated const promises: (() => Promise<CalculatorResult[]>)[] = [this.selectedSheetTypeName, ...(sheets.value as Sheet[]).map((sheet: Sheet) => sheet.type.name) .filter((sheetTypeName: string) => sheetTypeName != this.selectedSheetTypeName)] .map((sheetTypeName: string) => this.calculateSheet.bind(this, propertyValues, sheetTypeName)); // now, await all results, and build a common array from 6 arrays(one per sheet) of results let results: CalculatorResult[] = []; // WHERE IS THE DIFFERENCE OF // THIS ONE const myValues = await Promise.all(promises); console.log("All 6 sheets promises here bellow:"); console.log(myValues); // VERSUS THIS ONE for (const promise of promises) { let sheetResults = await promise(); console.log("Sheet results:") console.log(sheetResults) results.push(...sheetResults); console.log("All results:") console.log(results) }

En el primer caso ( myValues ), ¿por qué tenemos seis funciones como resultado, en lugar de la matriz CalculatorResults?

Ingrese la descripción de la imagen aquí

about 4 years ago · Juan Pablo Isaza
1 Respostas
Responde à pergunta

0

TL;DR

Como regla general:

  • Si desea ejecutar todo en paralelo y obtener un resultado lo más rápido posible, use Promise.all
  • Si quiere hacer lo mismo que arriba, pero tiene todos los resultados prometidos si uno falla, use: allSettled o similar
  • Si desea ejecutar todas las promesas secuencialmente, use for Promise

En primer lugar, en su ejemplo, la matriz de promises es en realidad una matriz de funciones, que nunca ejecuta, por eso Promise.all devuelve todos los fns. Arreglar:

 const promises = ….map((sheetTypeName: string) => this.calculateSheet(propertyValues, sheetTypeName));

Promise.all

Si todas las promesas tienen éxito :

  • Esperará hasta que finalicen todas las promesas y devolverá una serie de resultados.

Si alguna promesa es rechazada :

  • No importa cuándo se rechace la promesa ni si se rechazan dos o más, devolverá una promesa rechazada que contiene el error de la primera promesa rechazada. Sucederá tan pronto como se arroje el primer error.
  • Nunca se sabe qué promesa fue la que falló. El error debe contener información adicional si desea saber qué promesa lo generó.
  • Si dos o más promesas fallaron, nunca lo sabrás. Se desconoce cómo es el estado de las otras promesas, ya que solo obtiene el primer error que sucedió. Es posible que otras promesas no finalicen cuando se rechaza la promesa.
  • Si desea esperar a que se resuelva/rechace cada promesa, puede usar allSettled o algo similar.

for promises

La principal diferencia es que ejecutará cada función secuencialmente . Esperará a ejecutar y finalizar el primero, para luego ejecutar el segundo, y así sucesivamente.

Además, tú controlas el flujo, por lo que si falla el primero, puedes elegir continuar o no, o qué hacer.

Por cierto, nunca usaría bind para implementar esto, ejecutaría cada método/función directamente en el for

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