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。