调度操作时,Redux Saga不会触发API调用

时间:2017-07-07 03:40:51

标签: redux generator redux-saga

之前我曾使用过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);
}

1 个答案:

答案 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);