TransWikia.com

¿Como resolver errores cuando se llaman multiples promesas en javaScript?

Stack Overflow en español Asked on December 5, 2021

Estoy aprendiendo de asincronismo y estoy intentando llamar multiples promesas en paralelo, la cosa es que de la API donde estoy sacando los datos al parecer el elemento no. 17 no hay nada o al menos me manda un error, eso lo comprobe directamente en la pagina oficial de la API.

Por ende como no hay nada, siempre que llame mi arreglo de promesas, me saldrá un error.

function getPersonaje(id) {
return new Promise((resolve, reject) => {
    const personaje = `${API_URL}${PEOPLE_URL.replace(':id', id)}`;

    // $.get permite hacer un request.
    $.get(personaje, opts, function(data) {
            resolve(data)
        })
        .fail(() => reject(id));
});
}

function onError(id) {
console.log(`Sucedio un error al obtener el personaje ${id}`)
}

var ids = [];
    for (var i = 0; i < 100; i++) {
    ids[i] = i + 1;
}

console.log(ids);

var promesas = ids.map(id => getPersonaje(id))
    Promise
       .all(promesas)
       .then(personajes => console.log(personajes))
       .catch(onError)

introducir la descripción de la imagen aquí

¿En esos casos que se hace? Este ejemplo es algo sencillo puedo poner un if y no añadir el numero 17 al arreglo, pero si estuviera trallendo mucho más datos, no sería optimo estar revisando donde esta el error, es decir hay alguna forma de omitir ese error y llamar los datos que si estan disponibles o que si se pudieron llamar? Imagino que debe haber algo asi.

One Answer

Promise.all es devuelta como fallida cuando encuentra el primer reject().

Pero si no te importa la dependencia una de otra, y solo quieres todos los resultados, fallen o no...

Promise.allSettled()

Eso resolvería tu problema... Un ejemplo:

    const promise1 = Promise.resolve(3);
    const promise2 = new Promise((resolve, reject) => setTimeout(reject, 100, 'foo'));
    
    Promise.allSettled([promise1, promise2])
    .then((results) => results.forEach((result) => console.log(result)));
    
    // expected output:
    // { status: "fulfilled", value: 3 }
    // { status: "rejected", reason: "foo" }

Answered by Diego Andrés on December 5, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP