【发布时间】:2016-12-06 18:27:00
【问题描述】:
您好,我是 react/redux 开发环境的新手,感谢您的帮助。
我试图通过在我的 app.js 中调用 dispatch(fetchAllPositions(selectedUserDivision)) 在 componentDidMount 时异步进行 2 个 API 调用
我在this post 中找到了一个建议的方法,fetchAllPositions 函数将两个动作函数包装在一个 Promise.all 中
export function fetchAllPositions(division) {
return dispatch => Promise.all([
dispatch(fetchUserPositionsIfNeeded(division)),
dispatch(fetchDefaultPositionsIfNeeded(division))
])
.then(console.log("fetched both"))
}
这两个动作函数几乎相同,只是调用的 API url 略有不同。其中一个如下所示,其中shouldFetchUserPosition 只是一个返回布尔值的纯函数:
function fetchUserPositions(division) {
return dispatch => {
const url = apiOptions.server + `/api/user/position?division=${division}`
dispatch(requestUserPositions(division))
return fetch(url, options)
.then(response => response.json())
.then(json => dispatch(receiveUserPositions(division,json)),
err => console.log(err))
}
}
export function fetchUserPositionsIfNeeded(division) {
return (dispatch, getState) => {
if (shouldFetchUserPositions(getState(), division)) {
return dispatch(fetchUserPositions(division))
} else {
return Promise.resolve()
}
}
}
逻辑是,对于更新,在拉取数据时发送REQUEST... 操作,然后在数据准备好更新到新状态时发送RECEIVE... 操作。
问题是Promise.all 应该等待REQUEST1 REQUEST2 RECEIVE1 RECEIVE2 所有人都进来之后才执行.then(console.log("fetched both"))
现在,是在前 2 个 REQUEST 完成后的 .then,而不是等待 2 个 RECEIVE 进来。
我怀疑这是 requestUserPositions() 在包装 fetch() 的函数中的嵌套性质
REQUEST 动作是一个简单的函数,在 reducer 中它只是将 isFetching 属性翻转为 true:
function requestUserPositions(division) {
return {
type: REQUEST_USER_POSITIONS,
division
}
}
对于这个冗长的问题,我深表歉意,但如果有任何建议,我将不胜感激。
【问题讨论】:
标签: reactjs redux redux-thunk