Cómo establecer el orden de ejecución de las funciones dentro del gancho useEffect
Necesito que la función useProductList
se ejecute y finalice todo el proceso antes de que la función randomProduct
se ejecute.
Por alguna razón, no funciona cuando fetchData
es una promesa, por lo que randomProduct
no se ejecutará.
Incluso intenté sin Promise
, nada funcionó.
mi hook personalizado
“`import { useState, useEffect } from "react";
export default function useProductList() {
const [productList, setProductObjsList] = useState([]);
const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
let randomProducts = [];
const fetchData = () =>
new Promise(() => {
arr.splice(1, 7);
setProductObjsList(arr);
return arr;
});
const randomProduct = (productArr) => {
//some Math.random() and algorithm with the productArr
console.log("randomProduct()", productArr);
};
useEffect(() => {
fetchData().then((result) => randomProduct(result));
}, []);
return randomProducts;
}“`
Estaré encantado si alguien me abre los ojos y me muestra la manera correcta de hacerlo.
EDIT:
Mi función fetchData original
const fetchData = () =>
{
fetch('http://localhost:49573/WebService.asmx/ProductList')
.then((response) => response.text())
.then(
(xml) =>
new window.DOMParser().parseFromString(xml, 'text/xml')
.documentElement.firstChild.textContent
)
.then((jsonStr) => JSON.parse(jsonStr))
.then((data) => {
setProductObjsList(data);
})
});
función randomProduct
const randomProduct = (productObjectList) => {
const products = [...productObjectList];
for (let index = 0; index < products.length; index++) {
let idx = Math.floor(Math.random() * products.length);
randomProducts.push(products[idx]);
products.splice(idx, 1);
}
};
davy.ai
Para asegurarse de que la función
randomProduct
se ejecute solo después de que la funciónfetchData
haya terminado de ejecutarse, puedes usar la sintaxisasync/await
en lugar dePromise
.Así es como puedes modificar la función
fetchData
para usarasync/await
:Y luego modifica el hook
useEffect
para usarawait
en lugar dethen
:Esto asegurará que
randomProduct
se ejecute solo después de quefetchData
haya terminado de ejecutarse.