假设我有一个带有按钮的模式,如果您单击它,该按钮会调度一个动作。我想知道所采取行动的结果:如果成功,我将关闭模式,否则关闭其他模式。 使用redux-thunk时,我的操作将类似于:
export const deleteObjects = () => {
return (dispatch, getState) => {
try {
...
dispatch(setObjects([]));
return true
} catch (e) {
return false
}
}
};
所以我可以在组件中使用结果。但是如何使用redux-sagas做同样的事情?据我所知,您可以将sagas与观察者一起使用。 我想到的一种解决方案是将回调函数传递给动作创建者,并在传奇中调用它。像这样:
export const deleteObjects = (callback) => ({
type: DELETE_OBJECTS,
callback
});
export function* deleteObjectsAsync({callback}) {
try {
...
put(setObjects([]))
yield call(callback, true)
} catch (err) {
yield call(callback, false)
}
}
function* watchGetPlaces() {
yield takeEvery(DELETE_OBJECTS, deleteObjectsAsync)
}
这是一个有效的解决方案,还是有更适当的方法呢?
答案 0 :(得分:1)
我不建议您提出建议的解决方案。传递回调函数是redux-saga试图阻止开发人员必须处理的精确操作之一。
一种干净的解决方案是将您的模式关闭功能包装到可以由某个动作调用的其传奇中。我不确定您如何打开模态,但是在我们的应用程序中,我们调度动作来打开和关闭模态。这样做可以使连接的组件和 sagas可以操纵任何模式。 Sagas旨在处理副作用。关闭模式是一个副作用。因此,传奇是放置闭模态逻辑的理想场所。
查看此样板:
export const closeModal = () => ({
type: CLOSE_MODAL,
});
function* onCloseModal() {
// Your logic for closing modals goes here
}
function* closeModalSaga() {
yield takeEvery(CLOSE_MODAL, onCloseModal)
}
export const deleteObjects = () => ({
type: DELETE_OBJECTS,
});
export function* deleteObjectsAsync() {
try {
...
yield put(setObjects([]))
yield put(closeModal());
} catch (err) {
// Your "do-something-else" logic here
// I'd recommend dispatching another action
}
}
function* watchGetPlaces() {
yield takeEvery(DELETE_OBJECTS, deleteObjectsAsync)
}