为什么 takeLeading redux-sagas 不起作用
Why takeLeading redux-sagas isn't working
我不太清楚为什么 takeLeading
对我不起作用(takeLeading 应该接受第一个调用并忽略后续调用,直到第一个被 returned)。它像 takeEvery
一样调用相同的调用 3 次,使用来自 3 个独立组件的相同参数在它们的 useEffect(() => {getApiWatcher(params)}, [])
on mount 挂钩上。看起来那些在第二次调用之前没有 return 所以我知道这不是 3 个独特的独立调用。
function getApi(params) {
console.log('GET CALL') // called 3 times in console and network tab
return Api.doCall(
`API/${params.number}/${params.type}`,
'GET'
);
}
function* getApiActionEffect(action) {
const { payload } = action;
try {
const response = yield call(getApi, payload);
yield put(getApiSuccess({ data: response.data, status: response.status }));
} catch (e) {
yield put(getApiError(e.response));
}
}
export function* getApiActionWatcher() {
yield takeLeading( // should make sure only first call is made and subsequent are ignored
GET_API_WATCHER,
getApiActionEffect
);
}
// action
export function getApiWatcher(payload) {
return { type: GET_API_WATCHER, payload };
}
// passed dispatch as props
const mapDispatchToProps = (dispatch) => bindActionCreators( { getApiWatcher, }, dispatch );
// root saga
export default function* rootSaga() {
yield all([... getApiActionWatcher(),...])
}
涉及更多代码,因此我没有创建示例 jsfiddle,但我正在寻找可能出错的想法!可能看漏了一些东西。
如果你想处理每个 GET_API_WATCHER
动作,那么你最好 takeEvery
redux-saga helper
.
并且 docs 表示使用 takeLeading
生成的任务会阻塞其他任务,直到它完成。
takeLeading
正在按预期工作。对 getApi
的调用立即 returns.
如果 getApi
return 是一个 Promise,您的代码才能按您希望的方式工作的唯一方法。如果 getApi()
是 return 一个 Promise,那么 getApiActionEffect
会阻塞直到 Promise 解决。
原来在 root saga 中有重复的导入函数。例如:
// root saga
export default function* rootSaga() {
yield all([
... getApiActionWatcher(),...
... getApiActionWatcher(),...
])
}
删除重复项解决了问题。它还删除了我没有处理的其他重复调用。
我不太清楚为什么 takeLeading
对我不起作用(takeLeading 应该接受第一个调用并忽略后续调用,直到第一个被 returned)。它像 takeEvery
一样调用相同的调用 3 次,使用来自 3 个独立组件的相同参数在它们的 useEffect(() => {getApiWatcher(params)}, [])
on mount 挂钩上。看起来那些在第二次调用之前没有 return 所以我知道这不是 3 个独特的独立调用。
function getApi(params) {
console.log('GET CALL') // called 3 times in console and network tab
return Api.doCall(
`API/${params.number}/${params.type}`,
'GET'
);
}
function* getApiActionEffect(action) {
const { payload } = action;
try {
const response = yield call(getApi, payload);
yield put(getApiSuccess({ data: response.data, status: response.status }));
} catch (e) {
yield put(getApiError(e.response));
}
}
export function* getApiActionWatcher() {
yield takeLeading( // should make sure only first call is made and subsequent are ignored
GET_API_WATCHER,
getApiActionEffect
);
}
// action
export function getApiWatcher(payload) {
return { type: GET_API_WATCHER, payload };
}
// passed dispatch as props
const mapDispatchToProps = (dispatch) => bindActionCreators( { getApiWatcher, }, dispatch );
// root saga
export default function* rootSaga() {
yield all([... getApiActionWatcher(),...])
}
涉及更多代码,因此我没有创建示例 jsfiddle,但我正在寻找可能出错的想法!可能看漏了一些东西。
如果你想处理每个 GET_API_WATCHER
动作,那么你最好 takeEvery
redux-saga helper
.
并且 docs 表示使用 takeLeading
生成的任务会阻塞其他任务,直到它完成。
takeLeading
正在按预期工作。对 getApi
的调用立即 returns.
如果 getApi
return 是一个 Promise,您的代码才能按您希望的方式工作的唯一方法。如果 getApi()
是 return 一个 Promise,那么 getApiActionEffect
会阻塞直到 Promise 解决。
原来在 root saga 中有重复的导入函数。例如:
// root saga
export default function* rootSaga() {
yield all([
... getApiActionWatcher(),...
... getApiActionWatcher(),...
])
}
删除重复项解决了问题。它还删除了我没有处理的其他重复调用。