Я делаю несколько звонков с Promise.
Мои конечные точки API для извлечения:
- https://www.api-football.com/demo/v2/statistics/357/5/2019-08-30
- https://www.api-football.com/demo/v2/statistics/357/5/2019-09-30
- https://www.api-football.com/demo/v2/statistics/357/5/2019-10-30
Посмотреть код
export function getTeamsStats(league, team, type) {
return function(dispatch) {
const url = "https://www.api-football.com/demo/v2/statistics";
let dates = ["2019-08-30", "2019-09-30", "2019-10-30"];
const getAllData = (dates, i) => {
return Promise.allSettled(dates.map(x => url + '/' + 357 + '/' + 5 + '/' + x).map(fetchData));
}
const fetchData = (URL) => {
return axios
.get(URL)
.then(res => {
const {
matchsPlayed: { total: teamsTotalMatchsPlayed},
} = res.data.api.statistics.matchs;
const matchsPlayed = teamsTotalMatchsPlayed;
dispatch(receivedTeamsStat(matchsPlayed, type));
})
.catch(e => {
console.log(e);
});
}
getAllData(dates).then(resp=>{console.log(resp)}).catch(e=>{console.log(e)})
}
}
Затем в моем компоненте я помещаю в массив матчи, сыгранные этой конкретной командой (Сан-Паулу в этом примере) с начальной даты 30-8-2019 по 30-10-2019< /сильный>
const [dataHomeTeam, setDataHomeTeam] = useState([]);
useEffect(() => {
if (!team.matchsPlayed) {
return ;
}
setDataHomeTeam(prev =>
prev.concat([
{
matches: team.matchsPlayed,
}
])
);
},[team.matchsPlayed]);
console.log('Data Array', dataHomeTeam);
Проблема в том, что обычно при первом рендеринге страницы у меня правильный порядок совпадений, сделанных с 30-8-2019 по 30-10-2019
См. изображение журнала консоли
Но иногда нет, см. здесь
Итак, вопрос в том, как я могу убедиться, что Promise возвращает мне правильный порядок запросов?
Я использую Promise.allSettled
, несколько асинхронных задач, которые не зависят друг от друга для успешного завершения, но порядок не всегда правильный.
Promise.all
? - person goto1   schedule 08.09.2020fetchData
, но вы делаете что-то вродеdispatch
, что неясно, откуда это берется, поэтому я предполагаю, что проблема, которую вы видите, заключается в том, что эти отправки запускаются не по порядку (что не должно происходить, если только вам не повезет), но если вы вызоветеgetAllData
, который возвращаетPromise.all
, гдеfetchData
возвращает окончательный результат внутриthen
(вместо вызова отправки), вы получите правильное поведение. - person goto1   schedule 08.09.2020getTeamsStats
внутри вашего компонента. - person goto1   schedule 08.09.2020Promise.allSettled
. Он возвращается в том же порядке, что и они. Мое предложение здесь состоит в том, чтобы дождаться, покаPromise.allSettled
разрешится с правильным статусом, а затем соответствующим образом отправить данные. - person Pranay Tripathi   schedule 08.09.2020