为什么采取领先的 redux-sagas 不起作用



我不太确定takeLeading为什么不适合我(takeLeading应该接受第一个调用,并忽略后续调用,直到返回第一个调用为止(。它调用同一个调用3次,就像takeEvery一样,具有来自挂接挂钩上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,但我正在寻找可能出错的想法!可能是看过头了。

发现根传奇中存在重复的导入函数。例如:

// root saga
export default function* rootSaga() {
yield all([
... getApiActionWatcher(),...
... getApiActionWatcher(),...
])
}

删除重复项解决了问题。它还删除了我没有处理的其他重复呼叫

如果你想处理每个GET_API_WATCHER动作,那么你最好是takeEveryredux传奇helper

文档表示,takeLeading生成的任务会阻止其他任务,直到完成为止。

takeLeading按预期工作。对getApi的调用立即返回。

如果getApi返回Promise,那么您的代码将以您希望的方式工作。如果getApi()返回Promise,则getApiActionEffect将阻塞,直到Promise得到解决。

相关内容

  • 没有找到相关文章

最新更新