Как добиться обратных вызовов в Redux-Saga?
сценарий, я хочу перенаправить пользователя или показать предупреждение на основе успеха, обратных вызовов ошибок после отправки действия.
Ниже приведен код, используя redux-thunk задачи
this.props.actions.login(credentials)
.then((success)=>redirectToHomePage)
.catch((error)=>alertError);
потому что действие отправки в redux-thunk возвращает обещание, легко действовать с ответом.
но теперь я пачкаю руки на redux-saga и пытаюсь понять, как я могу достичь того же результата, что и выше кода. поскольку Сага запустите в другом потоке, я не могу получить обратный вызов из запроса выше. я просто хотел узнать, как вы это делаете. или какой лучший способ справиться с обратными вызовами при использовании redux-saga ? действие отправки выглядит следующим образом:
этого.реквизит.действия.логин(учетные данные);
и саги
function* login(action) {
try {
const state = yield select();
const token = state.authReducer.token;
const response = yield call(API.login,action.params,token);
yield put({type: ACTION_TYPES.LOGIN_SUCCESS, payload:response.data});
yield call(setItem,AUTH_STORAGE_KEY,response.data.api_token);
} catch (error) {
yield put({type: ACTION_TYPES.LOGIN_FAILURE, error})
}
}
сага монитор
export function* loginMonitor() {
yield takeLatest(ACTION_TYPES.LOGIN_REQUEST,login);
}
создатель действий
function login(params) {
return {
type: ACTION_TYPES.LOGIN_REQUEST,
params
}
}
2 ответов
Я думаю, вы должны добавить перенаправление и оповещение в генератор входа. Таким образом, вся логика в саге, и это еще легко проверить. Так что в основном ваш login saga будет выглядеть так:
function* login(action) {
try {
const state = yield select();
const token = state.authReducer.token;
const response = yield call(API.login,action.params,token);
yield put({type: ACTION_TYPES.LOGIN_SUCCESS, payload:response.data});
yield call(setItem,AUTH_STORAGE_KEY,response.data.api_token);
yield call(redirectToHomePage); // add this...
} catch (error) {
yield put({type: ACTION_TYPES.LOGIN_FAILURE, error});
yield call(alertError); // and this
}
}
Я провел весь день, возясь с этим материалом, переключаясь с thunk на redux-saga
у меня тоже есть много кода, который выглядит так
this.props.actions.login(credentials)
.then((success)=>redirectToHomePage)
.catch((error)=>alertError);
его можно использовать thunk + saga
function login(params) {
return (dispatch) => {
return new Promise((resolve, reject) => {
dispatch({
type: ACTION_TYPES.LOGIN_REQUEST,
params,
resolve,
reject
})
}
}
}
тогда в Saga land вы можете просто сделать что-то вроде
function* login(action) {
let response = yourApi.request('http://www.urthing.com/login')
if (response.success) {
action.resolve(response.success) // or whatever
} else { action.reject() }
}