Redux-saga 使用可重用生成器分派多个动作
Redux-saga dispatch more than one action with reusable generator
我正在使用可重复使用的生成器函数来调用 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);
}
非常感谢任何反馈。
谢谢!
有 postEntity
return 值,例如 response
或 true/false。然后在 postLogin
中检查该值。
const result = yield postEntity(login, api.login, [action.payload.email, action.payload.password]);
然后检查 result
的值并相应地触发 success/failure 事件,就像您在 postEntity
中所做的那样。
if(result) {yield put(successCreator())} else { ...}
我正在使用可重复使用的生成器函数来调用 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);
}
非常感谢任何反馈。
谢谢!
有 postEntity
return 值,例如 response
或 true/false。然后在 postLogin
中检查该值。
const result = yield postEntity(login, api.login, [action.payload.email, action.payload.password]);
然后检查 result
的值并相应地触发 success/failure 事件,就像您在 postEntity
中所做的那样。
if(result) {yield put(successCreator())} else { ...}