Me gustaría actualizar un estado cada vez que recibo una promesa, en un bucle. Pero mi estado solo muestra la última promesa. Supongo que es porque, como el estado establecido es asíncrono, usa el Mapa disponible antes de las actualizaciones de estado anteriores. ¿Cómo puedo lograr eso sin usar Promise.all?
const [dataList, setDataList] = useRef(new Map()) useEffect(() => { ids.forEach(id => { getData(id).then(data => { if (data) { setDataList(dataList.set(id, data)) } }) }) }, [ids])Está relacionado con cómo funciona la reacción. Espera todas las llamadas de setState en un state específico y elige la última. Si desea evitar este comportamiento, use una función de actualización que tomará el state anterior y devolverá uno nuevo. En tu caso así:
const [dataList, setDataList] = useRef(new Map()) useEffect(() => { ids.forEach(id => { getData(id).then(data => { if (data) { setDataList(dataList => { let newDataList = new Map(dataList); newDataList.set(id, data); return newDataList; }) } }) }) }, [ids])Creo que puedes lograrlo con async await de esta manera:
useEffect(() => { ids.forEach(id => { async function fetchMyAPI() { const data = await getData(id); if (data) { setDataList(dataList.set(id, data)) } } fetchMyAPI() }) }, [ids])