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
});