Solución:
Si desea repetir y serializar las promesas, no ejecute ninguna otra get
llamadas una vez que una falla, luego intente este bucle:
async function getAllResults() { // returns a promise for 250 results
let totalResults = [];
try {
for (let i = 0; i < 5; i++) {
totalResults.push(...await getResults.get());
}
} catch(e) {};
return totalResults;
}
Esto usa el EcmaScript2017 async
y await
sintaxis. Cuando no esté disponible, encadena las promesas con then
:
function getAllResults() {
let totalResults = [];
let prom = Promise.resolve([]);
for (let i = 0; i < 5; i++) {
prom = prom.then(results => {
totalResults = totalResults.concat(results);
return getResults.get();
});
}
return prom.then(results => totalResults.concat(results));
}
Tenga en cuenta que debe evitar el antipatrón de construcción de promesas. No es necesario utilizar new Promise
aquí.
También considere agregar un .catch()
invocar la promesa devuelta por la función anterior, para hacer frente a las condiciones de error.
Finalmente, tenga en cuenta que concat
no modifica la matriz a la que lo llama. Devuelve la matriz concatenada, por lo que debe asignar ese valor de retorno. En su código no asigna el valor de retorno, por lo que la llamada no tiene ningún efecto.
Consulte también la promesa de JavaScript ES6 para el bucle.
Probablemente solo necesitas Promise.all
método. Para cada solicitud, debe crear una promesa y ponerla en una matriz, luego envuelve todo en all
método y ya está.
Ejemplo (asumiendo que getResults.get
devuelve una promesa):
let promiseChain = [];
for(let i = 0; i <5; i++){
promiseChain.push(getResults.get());
}
Promise.all(promiseChain)
.then(callback)
Puede leer más sobre este método aquí: Promise.all en MDN
EDITAR
Puede acceder a los datos devueltos por las promesas de esta manera:
function callback(data){
doSomething(data[0]) //data from the first promise in the chain
...
doEventuallySomethingElse(data[4]) //data from the last promise
}