Redux-saga使用可重复使用的发生器发送多个动作

时间:2016-11-11 17:35:58

标签: redux redux-saga

我正在使用可重用的生成器函数来调用REQUEST / SUCCESS / FAILURE动作。然后我有另一个生成器来调用该函数,但我希望获得某种反馈并提出另一个动作。不知道如何解释它,这是我想要做的一个例子:

/* 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 个答案:

答案 0 :(得分:0)

postEntity返回response或true / false之类的值。然后在postLogin中检查该值。

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

然后检查result的值并相应地触发成功/失败事件,就像在postEntity中一样。

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