2017-07-07 145 views
0

我以前使用過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); 
} 

回答

0

首先,您的入口點配置好傳奇嗎?您應該在商店創建中添加傳奇中間件,並且不要忘記通過runSaga方法調用傳奇過程管理器。

第二,爲什麼你重新委託生成器實例升級?也許它的意思是yield takeLatest(LOAD_USER_REQUEST, loadUserDetails);沒有yield*運營商?具有完全不同的語義。

第三,通過API參考,call效果函數或生成器引用,但您提供承諾對象。也許它的意思是const user = yield call(() => userLogin(payload));const user = yield call(userLogin, payload);