2017-03-16 61 views
1

我在我的應用程序中使用了redux-persist和redux-observable,並注意到在存儲狀態恢復之前我的包含observable的API調用正在發生。並且恢復會使用過時的數據覆蓋提取的值。 在緩衝時如何暫停rootEpic,直到persist/REHYDRATE操作到達?暫停rootEpic直到持續完成

回答

0

如果您想等到發生「事件」,您可以使用.skipUntil。例如:

const action$ = new Rx.Subject(); 
 

 
// In your epic 
 
action$ 
 
    .skipUntil(action$.filter(({ type }) => type === 'hydrated')) 
 
    .subscribe(x => console.log(x)); 
 

 
// "Rehydrate" 
 
action$.next({ type: 'hello!' }); 
 
action$.next({ type: 'hello?' }); 
 
action$.next({ type: 'any body there?' }); 
 
action$.next({ type: 'hydrated' }); 
 
action$.next({ type: 'do' }); 
 
action$.next({ type: 'you' }); 
 
action$.next({ type: 'see' }); 
 
action$.next({ type: 'me' }); 
 
action$.next({ type: 'now' });
<script src="https://unpkg.com/rxjs/bundles/Rx.min.js"></script>

我想,爲了不將它添加到您所有的史詩,你可以.mergeMap()根史詩或東西:)


後討論在下面的評論

這個問題可能同樣o與其他中間件一起發生。因此,這可能是一個更好的解決方案,直到重新水合完成之後纔開啓任何動作。

+0

在你的代碼中,所有的動作都會在'hydrated'被放棄之前發生。相反,他們應該被緩衝並在「水合」之後回覆到史詩中。 –

+0

對不起,以爲這是你想要的:-x但是,在狀態恢復之前,你的應用程序不應該啓動任何操作嗎?看起來你會遇到與其他中間件相同的問題。 –

+0

>>但是,在狀態恢復之前,您的應用程序不應該啓動任何操作嗎? 這將工作得很好。 我有以下archirecture,組件火災行動(例如FETCH_BACKGROUND)。 Epic攔截此動作,並向服務器發送請求以獲取後臺網址。在中間件從服務器獲得響應之後,它觸發FETCH_BACKGROUND_SUCCESS將後臺url設置爲狀態。 然而,在我的情況下,運行後的REHYDRATE去改寫新設置的狀態。 –

0

我對redux-persist並不熟悉,但它可能會或可能不重要,請注意您在中間件中傳遞的順序以減少重要性。一些中間件需要在別人之前或之後。如果這聽起來與你的問題有關,你可以嘗試交換它們。

+0

事實上,它與訂單無關,我也有同樣的問題,我試過他們兩個 –

相關問題