2017-03-16 136 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

事实上,它与订单无关,我也有同样的问题,我试过他们两个 –

相关问题