• Jobs
  • About Us
  • professionals
    • Home
    • Jobs
    • Courses and challenges
  • business
    • Home
    • Post vacancy
    • Our process
    • Pricing
    • Assessments
    • Payroll
    • Blog
    • Sales
    • Salary Calculator

0

126
Views
Cómo hacer una segunda llamada API basada en el valor obtenido de la primera. con ganchos React y useEffect

Estoy tratando de hacer una llamada a la primera API que contiene una carga de diferentes CATEGORÍAS y luego usarla para hacer una segunda llamada a otra API que contiene diferentes elementos de categoría de cada CATEGORÍA de la primera. Soy nuevo en reaccionar y no sé muy bien cómo hacer que la lógica funcione. Esta es mi idea a continuación. Los elementos de categoría se muestran en función de las CATEGORÍAS seleccionadas. Estoy confundido sobre cómo usar el valor de la primera para hacer la segunda llamada.

 const [catalog,setCatalog] = useState([]); const [catalogItems,setCatalogItems]= useState([]); useEffect(() => {  const fetchData = async () => {   await fetchMarketingCategories()   .then((result)=>{    setCatalog(result);     console.log("result",result);       })   .then(async (categoryId)=>{         const {items = []} = await getAdvisorMarketingCatalog(categoryId)     setCatalogItems(items);   })    };  fetchData();   }); }, []);
about 3 years ago · Juan Pablo Isaza
3 answers
Answer question

0

Solo use async await, no use async await con then .

Así como esto:

 useEffect(async () => { const result = await fetchMarketingCategories() setCatalog(result) console.log('result', result) // not sure how you want to get the id from result const categoryId = getCategoryIdFromResult(result) const { items = [] } = await getAdvisorMarketingCatalog(categoryId) setCatalogItems(items) })
about 3 years ago · Juan Pablo Isaza Report

0

No estoy completamente seguro de lo que estás haciendo, pero explicaré lo que estoy haciendo a continuación.

Cuando se carga mi componente, con la ayuda de mi primer useEffect , obtengo los primeros catálogos. Estos resultados luego se representan en la interfaz de usuario. Cuando el usuario hace clic en cualquiera de los catálogos, configuro su id en estado y, con la ayuda de mi segundo useEffect , obtengo el siguiente resultado de la API.

Aquí está mi código:

 function App() { const [catalog, setCatalog] = useState([]); const [catalogItems, setCatalogItems] = useState([]); const [selectedCatalog, setSelectedCatalog] = useState(); useEffect(() => { const fetchData = async () => { const result = await fetchMarketingCategories(); setCatalog(result); console.log("result", result); }; fetchData(); }, []); useEffect(() => { const fetchDetails = async () => { const { items = [] } = await getAdvisorMarketingCatalog(selectedCatalog); setCatalogItems(items); }; if (selectedCatalog) { fetchDetails(); } }, [selectedCatalog]); return ( <div> {catalog?.map((c) => ( <div onClick={() => setSelectedCatalog(c.id)}>{c.name}</div> ))} </div> ); }
about 3 years ago · Juan Pablo Isaza Report

0

Creo que está tratando de obtener datos en función de los datos obtenidos previamente y hacerlo simultáneamente. Para hacerlo una forma puede ser:

 const fetchData = async () => { try { const getCategories = await fetchMarketingCategories() setCatalog(getCategories) // Now if fetch1 gives you array of catalogs with id you can just use // Array.map() to fetch catalog items. But this will ping a lot of request // to the api. But if this is the only way you need to do then go ahead. let finalData = [] finalData = getCategories.map(async (items, idx)=> { return await getAdvisorMarketingCatalog(items.id) }) setCatalogItems(finalData) } catch (err) { // Do what you want with the error } } useEffect(()=> { let ignore = false if (!ignore) { fetchData() } return () => ignore = true }, [])
about 3 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Our process Sales
Legal
Terms and conditions Privacy policy
© 2025 PeakU Inc. All Rights Reserved.

Andres GPT

Recommend me some offers
I have an error