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?
Como regla general:
Promise.allfor 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 :
Si alguna promesa es rechazada :
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