所以基本上我用thunk和redux-promise-middleware调度一个动作,它产生一个返回promise的API调用 . 然后,我将承诺返回给另一个动作创建者作为“有效负载”参数,该参数与redux-promise-middleware一起使用,并处理不同的动作MY_ACTION_TYPE_PENDING或MY_ACTION_TYPE_REJECTED或MY_ACTION_TYPE_FULFILLED . 我的问题是我是否通过_REJECTED操作处理reducer中的错误并且没有在我的调度中捕获它(actionCreator(payload)?当我没有在我的调度上发现错误时,我在控制台中收到警告,尽管我的reducer处理了_REJECTED ACTION错误 .
以下是我的一些行动:
export const RECEIVE_POSTS = 'RECEIVE_POSTS';
export const receivePosts = (data) => ({
type: RECEIVE_POSTS,
payload: data
})
// thunk middleware for fetching blog
export const fetchPosts = () => {
return (dispatch) => {
const payload = contentfulClient.getEntries().then(
data => data.items,
error => console.log('An error occurred in fetchPost thunk middleware', error)
)
return dispatch(receivePosts(payload))
.catch((error) => {
console.log('caught error in fetchPost', error)
})
}
}
那么这是我的一些博客Reducer文件,它处理承诺中间件发出的动作
const status = (state = Status.IDLE, action) => {
switch (action.type) {
case `${RECEIVE_POSTS}_PENDING` :
return Status.PENDING;
case `${RECEIVE_POSTS}_FULFILLED`:
return Status.FULFILLED;
case `${RECEIVE_POSTS}_REJECTED`:
return Status.REJECTED;
default:
return state
}
}
const error = (state = null, action) => {
switch (action.type) {
case `${RECEIVE_POSTS}_REJECTED`:
return action.payload.message
default:
return state;
}
}
2 回答
这是一个很好的问题,我认为没有一个答案 . 最终,这取决于开发人员或开发团队 . 作为一种做法,我认为,是的,应该在发送时处理/捕获承诺错误 . 这就是为什么......
在您的示例中,您没有捕获promise错误 . 正如您所解释的那样,您只能处理减速器中的错误 .
您读取类型为
${RECEIVE_POSTS}_REJECTED
的对象并将更改写入状态 . 当您对状态进行更改时,您(可能会更新UI和/或调度副作用来处理错误 . 这是Redux的典型实现 .然而,实际的承诺在这个实现中仍然没有被捕获 . 为了捕获promise错误,您需要在dispatch(或in a middleware)处执行此操作 .
如果在分派时捕获到错误,则不会在控制台中看到错误 . 详细,但直截了当/明确,这种做法使其他开发人员清楚如何处理错误 . 我认为清晰度对于可维护性和未来的变化很重要,因此我认为为什么我会在调度时发现错误 .
希望有所帮助!
我发现与
redux-promise-middleware
自动类型修改相比,更容易推理redux-thunk
代码...所以发布作为替代,以防其他人发现比较也有用: