其他传奇的传奇

时间:2017-04-21 14:37:10

标签: redux-saga

我发现如何在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的优势是什么?

我确信我遗漏了一些非常简单的事情,但我找不到任何解决方案......

1 个答案:

答案 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));
    }
}