之前我曾使用过redux saga,但我还是比较新的。无论如何,我似乎遇到了下面代码中的问题。
在顶部,您将看到我用来触发此AJAX请求的动作创建者。 Redux正确调度此操作并在我的控制台中记录LOAD_USER_REQUEST
类型但是功能链在那里停止。在下面的代码中,您会看到LOAD_USER_REQUEST
应该调用loadUserDetails
生成器,然后应该使用我的操作创建者中收到的有效负载调用userLogin
。
如果我能提供任何可能有用的其他信息,请告诉我。在此先感谢:)
// Action Creator for LOAD_USER_REQUEST.
export const getExistingUser = ({email = 'tt@gmail.com', password = '12345'} = {}) => ({
type: LOAD_USER_REQUEST,
payload: {email, password}
})
// API call being used in loadUserDetails Saga
export const userLogin = ({email = 'tt@gmail.com', 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);
}
答案 0 :(得分:0)
首先,你的入口指向saga配置得好吗?您应该在商店创建中添加saga-middleware,并且不要忘记通过runSaga
方法调用saga流程管理器。
第二,为什么要将生成器实例重新委托到更高级别?也许这对yield takeLatest(LOAD_USER_REQUEST, loadUserDetails);
没有yield*
运算符意味着什么?是有完全不同的语义。
第三,通过API引用,call
效果采用函数或生成器引用,但是您提供了promise对象。也许这意味着const user = yield call(() => userLogin(payload));
或const user = yield call(userLogin, payload);
?