如果我有一个带有 api 调用的异步操作,这可能是一个操作返回一个函数:
export function asyncAction(itemId) {
return (dispatch) => {
dispatch(requestStarted());
return sendRequest(itemId).then(
(result) => dispatch(requestSuccess()),
(error) => dispatch(requestFail())
);
};
}
或者返回一个对象并使用中间件拦截它并做一些事情:
export function asyncAction(itemId) {
return {
type: [ITEM_REQUEST, ITEM_REQUEST_SUCCESS, ITEM_REQUEST_FAILURE],
promise: sendRequest(itemId),
userId
};
}
// same middleware found in https://github.com/rackt/redux/issues/99
export default function promiseMiddleware() {
return (next) => (action) => {
const { promise, ...rest } = action;
if (!promise) {
return next(action);
}
next({ ...rest, readyState: 'request' );
return promise.then(
(result) => next({ ...rest, result, readyState: 'success' }),
(error) => next({ ...rest, error, readyState: 'failure' })
);
};
}
现在我的问题是:如何在调度 asyncAction 之前回滚到状态,这实质上意味着在状态(成功/失败 => 请求)中退回两步,使用 api 调用撤消上一次 api 调用。
例如,删除一个待办事项(这是一个异步操作)后,会显示一个带有撤消选项的弹出式快餐栏,单击它后,已删除的待办事项将被添加回 UI 以及 api 调用以将其添加回数据库。
我试过redux-undo但我觉得它不是为了解决这样的问题。
或者我应该忘记“撤消”并在用户单击撤消选项时发送一个全新的addTodo操作?
提前致谢 :-)