new data await async all javascript node.js promise bluebird

javascript - data - promise.all typescript



Bluebird Promise.all-múltiples promesas completadas agregando éxitos y rechazos (1)

Usted usaría .reflect :

Promise.all([p1,p2,p3,p4].map(x => x.reflect()).then(results => { results.forEach(result => { if(result.isFulfilled()){ // access result.value() } else { // access result.reason() } }); });

Esto solía manejarse con una función de .reflect que hacía esto para una matriz tradicionalmente - fue generalizada por .reflect ya que separa la agregación de la noción de una inspección de promesa y le permite hacer lo que hizo .settle a otras acciones como .any .some también.

Alguien presentó un caso interesante hoy con Bluebird, cuál es la mejor manera de manejar múltiples promesas cuando no estamos interesados ​​en detenernos en un cumplimiento o rechazo dado, sino más bien en inspeccionar el resultado final. Un ejemplo:

var p1 = new Promise(function(f,r){ setTimeout(function(){ console.log("p1"); f("yay"); }, 100); }); var p2 = new Promise(function(f,r){ setTimeout(function(){ console.log("p2"); r(new Error("boo")); }, 200); }) var p3 = new Promise(function(f,r){ setTimeout(function(){ console.log("p3"); r(new Error("yay")); }, 300); }); var p4 = new Promise(function(f,r){ setTimeout(function(){ console.log("p4"); f("yay"); }, 400); }); //Promise.all([p1,p2, p3, p4]).then(function(p){ // console.log("Results:",p); //}).error(function(e){ // console.log("Error:",e); //}); Promise.map([p1,p2, p3, p4],function(p){ console.log("results:",p); }, {concurrency:10}).error(function(e){ console.log("Error:",e); });

Aquí, si ejecutamos cualquiera de los mapas o todas las promesas rechazadas, los manejadores no informarán los resultados.

Por ejemplo, los resultados de ejecutar Promise.map como se implementó anteriormente son:

debugger listening on port 65222 p1 results: yay p2 Error: [Error: boo] p3 p4 Process finished with exit code 0

Aquí se ejecuta el código para cada promesa, pero solo se informa 1 resultado y 1 error. El error hace que el proceso se detenga.

Si no hacemos comentarios, todos tenemos un comportamiento similar. Esta vez, solo se reporta el error. Cualquier éxito no se convierte en entonces (comprensiblemente).

debugger listening on port 65313 p1 p2 Error: [Error: boo] p3 p4 Process finished with exit code 0

Dado este comportamiento, ¿cuál sería la mejor manera de implementar un escenario donde se ejecuten todas las promesas y los resultados de las promesas cumplidas se informen con todos y cada uno de los rechazos?

Algo como:

Promise.aggregate([p1,p2,p3,p4]).then(function(fulfilled, rejected){ console.log(fulfilled); //all success console.log(rejected); //any and all rejections/exceptions });