【发布时间】:2018-11-14 05:06:19
【问题描述】:
我正在使用 redux(并做出反应),我必须多次发出多个 api 请求。我正在使用 for 循环并承诺所有。正在解决的订单承诺是问题,因为订单是随机的 - 首先第二个承诺得到解决,然后是第一个,然后是第三个而不是 1,2,3。 我做错了什么还是如何更改订单?另外,当我没有收到任何数据时,停止迭代的方法是什么?我将不得不迭代大约 25 次,但不想对其进行硬编码。我可以用我的渔获来确定吗?非常感谢!
行动:
export const fetchData = () => {
return dispatch => {
const promises = [];
dispatch({type: FETCHING_DATA})
for (var i = 0; i < 3; i++) {
const start = i === 0 ? 0 : (i + "01");
let getData = axios.get(`${api_root_url}/v1/?start=${start}`)
.then(res => {
dispatch({type: FETCH_DATA_SUCESS, payload: res.data})
})
.catch(err => {
dispatch({type: FETCH_DATA_ERR, payload: err.data})
})
promises.push(getData)
}
return Promise.all(promises)
}
}
【问题讨论】:
-
如果顺序很重要,不要使用
Promise.all,.. 而是链接你的承诺,。如果你可以使用async / await,这真的很简单。 -
你不能使用
Promise.all()和一个固定的顺序。 -
另一种选择,如果你可以等到所有承诺完成,你可以在你的
Promise.all..之后调度。Promise.all的返回顺序是一致的,只是不是承诺执行的顺序. -
如果可以,请使用 async/await,否则您可以使用 bluebird 的
Promise.each()代替Promise.all()来确保每个 Promise 根据它在 Promise 数组中的顺序按顺序执行:@987654321 @ -
这是由用户动作发起的动作吗?问题在于用户可以启动动作 ABC,然后这些动作的承诺按 ACB 顺序解决,因此用户的最后一个动作是 C,但 UI 显示 B 的结果。这个问题及其解决方案在this pen click 中演示5 并在 5 秒内单击 1 按 F12 并查看由这些操作启动的单击顺序和已解析异步代码的顺序。
标签: javascript redux promise redux-thunk