在如何在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);
}
这种方法的问题我发现很难遵循逻辑,在我看来,它似乎回到了回调时间。
其他sagas以这种方式调用该操作:
yield put(makeServerRequest(options, loginSuccessful, loginError));
function *loginSuccessfulSaga(action) {
console.log('Success');
}
function *loginErrorSaga(action) {
console.log('Login error');
}
以这种方式,我有更多的观察者(每个请求的传奇都需要定义两个动作并运行两个观察者,每个返回函数一个)。
这个用例的最佳实践是什么?
我也可以进行真正的回调,但问题是生成器将一直存活直到回调结束,因此如果回调中有一个无限循环,那么生成器将永远挂起。
如果我需要执行make请求命令,那么redux-saga
相对于redux-thunk
的优点是什么?
我确信我错过了一些很容易的事情,但我没有找到任何解决办法.
发布于 2017-05-02 11:01:18
最有可能的是,你通常不需要这样的建筑。相反,您可以在一个函数中执行操作序列--单元中的生成器尝试/捕捉,并且通过构造产额+允诺来实现异步和等待。
也许你是说遵循解决方案?
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));
}
}
https://stackoverflow.com/questions/43545435
复制相似问题