2017-04-21 95 views
1

我在redux-saga中发现如何组织代码时遇到困难。我有这个特殊的传奇,使http请求(和许多其他工作)。其他人的传奇sagas

我不希望它成为一个必要的功能,但我也不想太困惑。

当时我已经创建了一个将通过这一行动来调用一个传奇的时刻:

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'); 
} 

这样我反正很多观察家(每传奇其中一个请求需要定义两个动作,并运行两个观察家之一:

动作以这种方式被其他传奇调用为每个返回功能)。

这个用例的最佳实践是什么?

我也可以做real回调,但问题是生成器将保持活着,直到回调结束,所以如果回调中有一个无限循环,那么生成器将永远挂起。

如果我需要做强制要求,那么redux-saga优于redux-thunk的优势是什么?

我的肯定,我失去了一些东西很容易了解这一点,但我没有找到任何解决办法...

回答

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)); 
    } 
} 
+0

谢谢,这确实是一个很好的方法 – rpadovani