Cuando se trabaja con múltiples promesas, podemos encontrarnos con un escenario en el que queremos empezar nuestro procesamiento cuando todas ellas hayan terminado. Por ejemplo, digamos que tenemos una cuadrícula con columnas dinámicas basadas en la preferencia del usuario y datos dinámicos para esas columnas. Entonces, tendremos dos llamadas a la API – una para buscar esas columnas dinámicas y otra para utilizar los datos reales. Así, podremos asignar los datos/cuerpo de la grilla a esas columnas sólo cuando tengamos respuestas para ambas llamadas a la API desde el servidor.
Aquí es donde Promise.all puede ayudar. Se necesitaría una serie de Promesas, que se resuelven sólo después de que todas ellas tengan éxito, para codificar el escenario anterior.
En cambio, podemos manejarlo de la siguiente manera:
12345678910111213141516171819202122232425vargetJSONFromServer=function(url){returnnewPromise((resolver, rechazar)=[;{ $.getJSON(url). done((json)=http://www.someapi.com/getGridColumns.resolve(json)).fail((xhr, status, err)=http://www.someapi. com/getGridData$0027}, itemPromises = gridUrls.map(getJSONFromServer);Promise.all(itemPromises).then(function(results){/// Llegamos aquí sólo si TODAS las promesas son resultados exitosos.forEach(function(item){/// Render the grid});}).catch(function(error){/// Catch failure of first failed promiseconsole.log("Failed: ", error);});
javascript
Con Promises.all(), cualquier excepción en cualquiera de las promesas pasadas a Promise.all() causará que la Promesa sea rechazada.
En ciertos casos, no necesitamos esperar a que todas las Promesas de nuestra matriz, pero queremos que la respuesta de la primera promesa de la matriz tenga éxito. Para ello, podemos usar Promise.race(). Esto también requeriría un array de promesas pero, a diferencia de Promise.all(), race() se cumplirá tan pronto como se cumpla la primera promesa de ese array.
Promise.all() tiene lo que se llama un comportamiento «fail-fast». Esto significa que si cualquier promesa es rechazada del conjunto de promesas que fueron pasadas, la promesa resultante de Promise.all() será rechazada inmediatamente. Por lo tanto, no esperará realmente a que las otras promesas terminen y sólo recibiremos el error de la petición rechazada.
Ejemplo de Promise.all
A continuación se muestra otro ejemplo de uso de Promise.all. Utilizando los registros de salida, se puede ver claramente la secuencia de ejecución de cada una de las Promesas.
12345678910111213141516171819202122232425262728funciónHacerEstaTareaAsimilada(delayParam){retornoNuevaPromesa(función(resolución){setTimeout(función(){consola. log($0027Resolver la promesa con retraso: $0027, delayParam);resolve($0027Hecho $0027+ delayParam);}, delayParam);};}var promise =Promise.all([Hacer Esta TareaAsimilada(1500),Hacer Esta TareaAsimilada(2500),Hacer Esta TareaAsimilada(500),Hacer Esta TareaAsimilada(3500)];promise. then(function(data){console.log($0027Todas las promesas resueltas!$0027); data.forEach(function(text){console.log(text);});//Output//Resolving promise with delay : 500//Resolving promise with delay : 1500//Resolving promise with delay : 2500//Resolving promise with delay : 3500//Todas las promesas resueltas!//Done 1500//Done 2500//Done 500//Done 3500
javascript