我发现如何在redux-saga
中组织代码有困难。我有这个特殊的传奇,它发出了http请求(以及许多其他工作)。
我不希望它成为势在必行的功能,但我也不想太混淆。
目前我已创建了一个将由此操作调用的传奇:
export const makeServerRequest = (options, success, error) => ({type: MAKE_REQUEST, options, success, error});
传奇是这样的:
function *makeRequestSaga(action) {
try {
// saga magic
yield put(action.success(response));
} catch (error) {
yield put(action.error(error));
}
}
function *serverSagasWatcher() {
yield takeEvery(MAKE_REQUEST, makeRequestSaga);
}
这种方法的问题我发现很难遵循逻辑,而且在我看来回到回调时间。
其他传奇以这种方式调用该动作:
yield put(makeServerRequest(options, loginSuccessful, loginError));
function *loginSuccessfulSaga(action) {
console.log('Success');
}
function *loginErrorSaga(action) {
console.log('Login error');
}
通过这种方式,无论如何我都有更多的观察者(每个执行请求的传奇需要定义两个动作并运行两个观察者,每个返回函数一个)。
此用例的最佳做法是什么?
我也可以做真正的回调,但问题是生成器会一直保持活着直到回调结束,所以如果回调中有无限循环,那么生成器将永远挂起。
如果我需要提出make请求,那么redux-saga
优于redux-thunk
的优势是什么?
我确信我遗漏了一些非常简单的事情,但我找不到任何解决方案......
答案 0 :(得分:1)
最有可能的是,您通常不需要这样的建筑。相反,你在单元TRY / catch中的生成器的一个函数中执行动作序列,并通过构造yield + Promise来实现异步和等待。
也许你的意思是关注解决方案?
function makeServerRequest(options) {
return fetch(options) /* Or more complex fetch logic */
.then((result) => {
let isOkay = true, errorMessage = null
/* Implement your verification logic here */
return isOkay
? Promise.resolve(result)
: Promise.reject(errorMessage)
})
}
function * makeRequestSaga(action) {
try {
yield call(makeServerRequest(options));
yield put(action.success(response));
} catch (error) {
yield put(action.error(error));
}
}