Saltar al contenido

Cómo crear un bucle de promesas

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
}
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *