代码之家  ›  专栏  ›  技术社区  ›  aericson

Redux saga使用可重用生成器调度多个动作

  •  0
  • aericson  · 技术社区  · 9 年前

    我使用一个可重用的生成器函数来调用请求/成功/失败操作。然后我有另一个生成器来调用该函数,但我希望得到某种反馈并提出另一个操作。不知道如何解释,下面是我想做的示例:

    /* in actions/index.js */
    export const login = {
      request: () => action(constants.LOGIN.REQUEST),
      success: (response) => {
        try {
          jwtDecode(response.auth_token);
        } catch (e) {
          return action(constants.LOGIN.FAILURE,
            { payload: { error: {
              status: 403,
              statusText: 'Invalid token',
            } } });
        }
        return action(constants.LOGIN.SUCCESS, { payload: { response } });
      },
      failure: error => action(constants.LOGIN.FAILURE, { payload: { error } }),
    };
    
    /* sagas/index.js */
    function* postEntity(entity, apiFn, body) {
      yield put(entity.request());
      const { response, error } = yield apply(null, apiFn, body);
      if (response) {
        yield put(entity.success(response));
      } else {
        yield put(entity.failure(error));
      }
    }
    
    function* postLogin(action) {
      yield postEntity(login, api.login, [action.payload.email, action.payload.password]);
      // How can I get some kind of feedback (succeed or not) from postEntity here and do a put(something_else) if succeeded?
    }
    
    export default function* rootSaga() {
      yield takeLatest(constants.LOGIN_USER, postLogin);
    }
    

    任何反馈都非常感谢。

    谢谢

    1 回复  |  直到 9 年前
        1
  •  0
  •   Rami Enbashi    9 年前

    postEntity 返回如下值 response 或真/假。然后 postLogin

    const result = yield postEntity(login, api.login, [action.payload.email, action.payload.password]);
    

    然后检查 result 并相应地触发成功/失败事件,就像您在 .

    if(result) {yield put(successCreator())} else { ...}