Redux Saga在动作发出时没有触发API调用
问题描述:
我以前使用过REDX传奇但我还是比较新的。无论如何,我似乎遇到了下面的代码中的问题。Redux Saga在动作发出时没有触发API调用
在顶部,您将看到我正在使用的动作创建器来触发此AJAX请求。 Redux正在正确调度此操作,并将LOAD_USER_REQUEST
类型记录在我的控制台中,但功能链在此处停止。在下面的代码中,您会看到LOAD_USER_REQUEST
应该调用loadUserDetails
生成器,然后生成器应该调用userLogin
,并在我的动作创建器中接收有效内容。
让我知道我是否可以提供任何可能有所帮助的附加信息。在此先感谢:)
// Action Creator for LOAD_USER_REQUEST.
export const getExistingUser = ({email = '[email protected]', password = '12345'} = {}) => ({
type: LOAD_USER_REQUEST,
payload: {email, password}
})
// API call being used in loadUserDetails Saga
export const userLogin = ({email = '[email protected]', password = '12345'} = {}) => {
return axios.post(`${API}auth/login`, {
email,
password
})
.then(res => {
console.log(res);
localStorage.setItem('token', res.data.token);
let user = res.data.user;
console.log(user);
return user;
})
.catch(err => new Error('userLogin err', err));
}
// Sagas
// loadUserDetails Saga - Should call fn above userLogin with payload from action creator
function* loadUserDetails(payload) {
const user = yield call(userLogin(payload));
yield put({type: LOAD_USER_SUCCESS, user}); // Yields effect to the reducer specifying the action type and user details
}
export function* watchRequest() {
yield* takeLatest(LOAD_USER_REQUEST, loadUserDetails);
}
答
首先,您的入口点配置好传奇吗?您应该在商店创建中添加传奇中间件,并且不要忘记通过runSaga
方法调用传奇过程管理器。
第二,为什么你重新委托生成器实例升级?也许它的意思是yield takeLatest(LOAD_USER_REQUEST, loadUserDetails);
没有yield*
运营商?具有完全不同的语义。
第三,通过API参考,call
效果函数或生成器引用,但您提供承诺对象。也许它的意思是const user = yield call(() => userLogin(payload));
或const user = yield call(userLogin, payload);
?