Вы извлекаете данные для местоположений для отдельных заданий, но переопределяете состояние местоположений только при использовании .then(setLocations)
Вместо этого вы должны сохранять местоположения как объект с идентификатором задания в качестве ключа
function useJobs () {
const [jobs, setJobs] = React.useState([])
const [locations, setLocations] = React.useState({})
React.useEffect(() => {
fetchJSON('/api/jobs/list-jobs', { headers: headers })
.then(setJobs)
}, [])
React.useEffect(() => {
for (const job of jobs) {
fetchJSON(`/api/jobs/view-location/${job.location}/`, { headers: headers })
.then((locations) => {
setLocations(prev => ({...prev, [job.id]: locations}))
})
}
}, [jobs])
return [jobs, locations]
}
Однако лучший способ для вас - использовать Promise.all для обновления всех местоположений в одном go
function useJobs () {
const [jobs, setJobs] = React.useState([])
const [locations, setLocations] = React.useState({})
React.useEffect(() => {
fetchJSON('/api/jobs/list-jobs', { headers: headers })
.then(setJobs)
}, [])
` React.useEffect(() => {
async function fetchLocations() {
const promises = [];
for (const job of jobs) {
promises.push(fetchJSON(`/api/jobs/view-location/${job.location}/`, { headers: headers })
.then((locations) => {
return {[job.id]: locations }
}))
}
const data = await Promise.all(promises);
setLocations(prev => Object.assign({}, ...data))
}
fetchLocations();
}, [jobs])
return [jobs, locations]
}
Теперь вы должны отметить, что местоположение, соответствующее каждому идентификатору задания, является просто объектом и не массив (согласно обсуждению в чате), поэтому вам не нужно отображать
{locations[job.id] && <Col key={locations[job.id].id} style={{ color: 'black' }}>Location:{locations[job.id].country}</Col>}