Javascript 在保留第一个操作的同时,发送具有可观察Redux的延迟第二个操作
我正在尝试创建一个史诗,它将执行一个动作,然后发送两个不同的动作,第二个动作延迟两秒。经过一系列尝试,这是我能做的最好的:Javascript 在保留第一个操作的同时,发送具有可观察Redux的延迟第二个操作,javascript,redux,rxjs,redux-thunk,redux-observable,Javascript,Redux,Rxjs,Redux Thunk,Redux Observable,我正在尝试创建一个史诗,它将执行一个动作,然后发送两个不同的动作,第二个动作延迟两秒。经过一系列尝试,这是我能做的最好的: const succeedEpic=action$=> action$.filter(action=>action.type==='FETCH\u WILL\u success') .mapTo({type:'FETCH_REQUEST'}) .merge(可观察的({type:'FETCH_SUCCESS'}).delay(2000)) 不幸的是,似乎: ({type:
const succeedEpic=action$=>
action$.filter(action=>action.type==='FETCH\u WILL\u success')
.mapTo({type:'FETCH_REQUEST'})
.merge(可观察的({type:'FETCH_SUCCESS'}).delay(2000))
不幸的是,似乎:
({type:'FETCH_SUCCESS'})的Observable.延迟(2000)
在加载我的应用程序时立即运行(而不是在父流中出现事件时)。我注意到了这一点,因为在加载我的应用程序两秒钟后,reducer就收到了FETCH\u SUCCESS
操作。我甚至附加了一个控制台。log
来确认这一点:
const succeedEpic=action$=>
action$.filter(action=>action.type==='FETCH\u WILL\u success')
.mapTo({type:'FETCH_REQUEST'})
.merge(Observable.of({type:'FETCH_SUCCESS'})
.do(()=>console.log('this has beging'))
.延迟(2000年)
)
“此操作已开始”将在应用程序启动时记录到控制台
我怀疑这与Redux Observable如何自动为您订阅有关
理想的行为是我将:
FETCH\u将成功事件的按钮
FETCH\u请求
事件FETCH\u SUCCESS
事件也许有一个更优雅的解决方案,但为什么不使用两个史诗并将它们结合起来呢 第一个发送获取请求:
const onFetchWillSucceed = action$ => action$.ofType('FETCH_WILL_SUCCEED')
.mapTo({ type: 'FETCH_REQUEST' })
第二个等待2秒并发送成功:
const onFetchRequest = action$ => action$.ofType('FETCH_REQUEST')
.delay(2000)
.mapTo({ type: 'FETCH_SUCCESS' })
最后,它们被合成了一部史诗
const both = combineEpics(onFetchWillSucceed, onFetchRequest)
也许有一个更优雅的解决方案,但为什么不使用两个史诗并将它们结合起来呢 第一个发送获取请求:
const onFetchWillSucceed = action$ => action$.ofType('FETCH_WILL_SUCCEED')
.mapTo({ type: 'FETCH_REQUEST' })
第二个等待2秒并发送成功:
const onFetchRequest = action$ => action$.ofType('FETCH_REQUEST')
.delay(2000)
.mapTo({ type: 'FETCH_SUCCESS' })
最后,它们被合成了一部史诗
const both = combineEpics(onFetchWillSucceed, onFetchRequest)
事实证明,我需要将这两个事件包装在一个
mergeMap
中。感谢RxJS Gitter频道上的@dorus给出了这个答案
这是我的工作成果:
const succeedEpic=action$=>
action$.filter(action=>action.type==='FETCH\u WILL\u success')
.mergeMapTo(Observable.of({type:'FETCH_REQUEST'})的)
.concat(Observable.of({type:'FETCH_SUCCESS'})
.延迟(1000)
merge
应该可以代替concat
,但我认为concat
有更好的语义意义。结果是我需要将我的两个事件都包装在mergeMap
中。感谢RxJS Gitter频道上的@dorus给出了这个答案
这是我的工作成果:
const succeedEpic=action$=>
action$.filter(action=>action.type==='FETCH\u WILL\u success')
.mergeMapTo(Observable.of({type:'FETCH_REQUEST'})的)
.concat(Observable.of({type:'FETCH_SUCCESS'})
.延迟(1000)
merge
应该也能代替concat
,但我认为concat
在语义上更有意义。这行不通,因为我的下一步是创建一个“fetch will fail”史诗,它也会发送fetch\u请求,但随后的操作是FETCH\u FAIL而不是FETCH\u SUCCESS。这不起作用,因为我的下一步是创建一个“FETCH will FAIL”epic,该epic也会发送FETCH\u请求,但随后的操作是FETCH\u FAIL而不是FETCH\u SUCCESS。