2017-09-15 37 views
1

我對於反應式編程相當新穎,並且想將以下代碼片段從redux-saga翻譯爲redux-observable將原文轉換爲可重編譯

這個想法是等待一些API調用,等待5秒鐘併發送另一個動作。

function* mySaga(action) { 
    const response = yield call(someApiCall); 
    yield call(delay, 5000); 
    yield put({ type: 'ACTION' }); 
} 

下面是我會做它終極版,可觀察到:

action$ 
    .ofType('SOME_ACTION') 
    .mergeMap(someApiCall) 
    .delay(5000) 
    .map(() => ({ type: 'ACTION' })) 

回答

2

你的翻譯是正確的,假設你在原來的例子省略yield takeEvery('SOME_ACTION', mySaga)東西。

但是,我會建議隔離你的Observable鏈;把所有的東西someApiCall()後申請,mergeMap內:

action$ 
    .ofType('SOME_ACTION') 
    .mergeMap(action => 
    someApiCall() 
     .delay(5000) 
     .map(() => ({ type: 'ACTION' })) 
) 

即使它使你的例子沒有功能上的差異,如果您或您的團隊成員後來進來,嘗試添加錯誤處理它至關重要你不「T讓mergeMap外的錯誤泡沫:

action$ 
    .ofType('SOME_ACTION') 
    .mergeMap(action => 
    someApiCall() 
     .delay(5000) 
     .map(() => ({ type: 'ACTION' })) 
     .catch(error => Observable.of({ 
     type: 'SOME_ACTION_FAILED', 
     payload: error 
     })) 
) 

如果您已經放置在頂層可觀察的catch,在mergeMap後,該錯誤會泡到頂級鏈,雖然你會趕上錯誤,你的史詩將不再聆聽未來動作。

如果不清楚爲什麼,我建議學習更多關於Observable +操作符的工作方式 - 我保證並不是那麼可怕!這是一個很棒的視頻,甚至涉及到「隔離你的可觀察鏈」,以便在正確的點捕捉錯誤。 https://youtu.be/3LKMwkuK0ZE?t=20m15s

+0

優秀的視頻資源,謝謝! – amaurymartiny