2017-04-21 88 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