Другой ответ верен, но если продолжить, подумайте о вашей функции следующим образом:
Сначала он обрабатывает этот блок, поэтому он перебирает страны и начинает выполнять запросы на выборку:
countries.forEach((country) => {
fetch(`https://api-football-v1.p.rapidapi.com/v2/leagues/current/${Object.keys(country)[0]}`, OPTIONS)
.then(response => response.json())
.then((data) => {
Object.values(country)[0].forEach((league) => {
data.api.leagues.filter((league_api) => {
if(league_api.name === league) {
leagues.push(league_api);
}
});
});
});
});
Далее, до того, как предыдущая работа успела что-либо сделать, он обработает следующий блок:
return {
type: 'SET_LEAGUES',
payload: leagues
};
Итак, он начал запускать countries.forEach
, но обещания выборки разрешаются за пределами этой функции, поэтому, прежде чем какие-либо данные будут помещены в ваш массив, вы уже возвращаете их.
Попробуйте использовать синтаксис await/async
, так вам будет гораздо легче справиться с попытками спорить обещания, что-то вроде:
export async function setLeagues() {
const countries = [
{
name: "france",
leagues: ["Ligue 1", "Ligue 2"],
},
{
name: "england",
leagues: ["Premier League"],
},
{
name: "germany",
leagues: ["Bundesliga 1"],
},
]
let payload = []
for (const country of countries) {
const { name, leagues } = country
const response = await fetch(
`https://api-football-v1.p.rapidapi.com/v2/leagues/current/${name}`,
OPTIONS
)
const data = await response.json()
for (const apiLeague of data.api.leagues) {
if (leagues.includes(apiLeague.name)) {
payload.push(apiLeague)
}
}
}
return {
type: "SET_LEAGUES",
payload,
}
}