【发布时间】:2020-09-28 19:13:24
【问题描述】:
我不太清楚为什么takeLeading 对我不起作用(takeLeading 应该接听第一个电话并忽略后续电话,直到返回第一个电话)。它像 takeEvery 一样调用相同的调用 3 次,其挂载钩子上的 useEffect(() => {getApiWatcher(params)}, []) 中的 3 个独立组件具有相同的参数。看起来那些在第二个被调用之前也没有返回,所以我知道这不是 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,但我正在寻找可能出现问题的想法!可能看多了。
【问题讨论】:
-
在codeandbox上重现会有帮助
标签: reactjs redux react-redux redux-saga