Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

209
Vistas
No puedo representar 2 componentes en función del resultado de 2 llamadas de búsqueda usando Promise.allSettled() si uno de ellos arroja un error

Estoy enviando dos llamadas de búsqueda en Promise.allSettled() y renderizando componentes basados en el resultado, un componente con datos si se cumple y un componente de error si se rechaza. El problema es que cuando uno de ellos arroja un error, se procesa un componente de error, pero el componente con datos para otra llamada no se procesa. ¿Por qué está pasando esto?

código:

 const sendRequest=useCallback(async (url)=>{ setIsLoading([true,true]); setError([null,null]); let response; try{ response=await Promise.allSettled( [fetch(url[0]),fetch(url[1])]); if(!response[0].value.ok){ throw new Error('Something went wrong'); } const data1=await response[0].value.json(); if(!response[1].value.ok){ throw new Error('Something went wrong'); } const data2=await response[1].value.json(); setItems([[data1.results],[data2.results]]); } catch(err){ if(!response[0].value.ok) {setError([err.message || 'Something went wrong',error[1]])}; if(!response[1].value.ok){setError([error[0],err.message || 'Something went wrong'])}; } setIsLoading([false,false]); },[])
about 4 years ago · Juan Pablo Isaza
2 Respuestas
Responde la pregunta

0

esto se debe a que setItems([[data1.results],[data2.results]]); no se llama al método, si alguna de sus solicitudes si da un error que está ejecutando throw new Error('Something went wrong') que hará que la ejecución del código capture el bloque y sus setItems([[data1.results],[data2.results]]); el método no se ejecutará. Por favor, eche un vistazo al siguiente código que resolverá su problema.

 let error = false; if(!response[0].value.ok){ error =true; }else{ const data1=await response[0].value.json(); } if(!response[1].value.ok){ error =true; }else{ const data2=await response[1].value.json(); } setItems([[data1.results],[data2.results]]); if(error){ throw new Error('Something went wrong') }
about 4 years ago · Juan Pablo Isaza Denunciar

0

Mejoré el código anterior que fue publicado por @abhishek sahu. Es mejor trabajar con protectores de cláusulas cuando se verifican errores. Los errores no deben utilizarse como indicadores en el flujo. Cuando ocurre un error, debe lanzarse inmediatamente, no esperar hasta el final del código/función. Algún otro error podría ocurrir en el medio y no sabrá si usa banderas como errores.

 const hanndleCallsAsync = async () =>{ if(!response[0].value.ok) throw new Error('Something wrong went with reponse0'); if(!response[1].value.ok){ throw new Error('Something wrong went with reponse1'); const data1=await response[0].value.json(); const data2=await response[1].value.json(); setItems([[data1.results],[data2.results]]); .... }

Ahora, su código es mucho más corto y más fácil de leer y averiguar dónde ocurrió el error.

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda