如何在Redux-Saga中实现回调?

ZaL*_*ZaL 19 reactjs redux redux-saga

方案是,我想在调度操作后根据成功,错误回调重定向用户或显示警报.

下面是使用redux-thunk执行任务的代码

this.props.actions.login(credentials)
.then((success)=>redirectToHomePage)
.catch((error)=>alertError);
Run Code Online (Sandbox Code Playgroud)

因为redux-thunk中的调度操作返回一个Promise,所以很容易对响应起作用.

但是现在我在redux-saga上弄脏了,试图弄清楚如何能够获得与上面代码相​​同的结果.由于Saga在不同的线程上运行,我无法从上面的查询中获得回调.所以我只想知道你们是怎么做到的.或者什么是使用redux-saga时处理回调的最佳方法?调度操作如下所示:

this.props.actions.login(凭证);

和传奇

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})
  }
}
Run Code Online (Sandbox Code Playgroud)

传奇监视器

export function* loginMonitor() {
  yield takeLatest(ACTION_TYPES.LOGIN_REQUEST,login);
}
Run Code Online (Sandbox Code Playgroud)

行动创造者

function login(params) {
  return {
    type: ACTION_TYPES.LOGIN_REQUEST,
    params
  }
}
Run Code Online (Sandbox Code Playgroud)

Jam*_*mes 11

我花了一整天的时间来研究这些东西,从thunk切换到redux-saga

我也有很多看起来像这样的代码

this.props.actions.login(credentials)
.then((success)=>redirectToHomePage)
.catch((error)=>alertError);
Run Code Online (Sandbox Code Playgroud)

它可以使用thunk + saga

function login(params) {
  return (dispatch) => {
    return new Promise((resolve, reject) => {
      dispatch({
        type: ACTION_TYPES.LOGIN_REQUEST,
        params,
        resolve, 
        reject
      })
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

然后在传奇的土地上,你可以做一些像

function* login(action) {
  let response = yourApi.request('http://www.urthing.com/login')
  if (response.success) {
    action.resolve(response.success) // or whatever
  } else { action.reject() }
}
Run Code Online (Sandbox Code Playgroud)


Hen*_*k R 8

我认为你应该为登录生成器添加重定向和警报.这样所有逻辑都在传奇中,它仍然很容易测试.所以基本上你的登录传奇看起来像这样:

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
  }
}
Run Code Online (Sandbox Code Playgroud)