【发布时间】:2020-09-13 19:44:21
【问题描述】:
我正在使用 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吗? -
是的,没有区别
-
现在我仔细观察了它,你并没有真正从
fetchData承诺中返回任何东西,但你正在做某种dispatch,目前还不清楚这是从哪里来的,所以我猜你看到的问题是这些调度不是按顺序触发的(除非你很幸运,否则它们不应该触发),但是如果你调用getAllData,它返回一个Promise.all,其中fetchData返回then中的最终结果(而不是调用 dispatch),那么你会得到正确的行为。 -
您介意用代码示例写答案以更好地理解吗?
-
不清楚您是如何在组件中使用
getTeamsStats函数的。
标签: javascript reactjs promise react-hooks use-effect