Javascript 如何将RxJS链接到redux observable epic中?

Javascript 如何将RxJS链接到redux observable epic中?,javascript,redux,rxjs,redux-observable,Javascript,Redux,Rxjs,Redux Observable,我最近刚刚开始学习redux observables和RxJS。我们在Redux中设置了全球警报。我希望能够设置警报,然后在设置的时间段后关闭该警报。在任何时候也可以有多个警报,用户可以在自动关闭警报之前手动关闭一个警报。我在这里添加了id,因此可以关闭正确的警报。 到目前为止,我尝试在初始映射之后使用延迟,而不是其他映射来实现这一点。但是,这跳过了第一个映射 export const addAlertEpic: Epic<Action, Action, RootState> = (

我最近刚刚开始学习redux observables和RxJS。我们在Redux中设置了全球警报。我希望能够设置警报,然后在设置的时间段后关闭该警报。在任何时候也可以有多个警报,用户可以在自动关闭警报之前手动关闭一个警报。我在这里添加了id,因此可以关闭正确的警报。 到目前为止,我尝试在初始映射之后使用延迟,而不是其他映射来实现这一点。但是,这跳过了第一个映射

export const addAlertEpic: Epic<Action, Action, RootState> = (
  action$,
  state$
) =>
  action$.pipe(
    ofType(slice.actions.addAlert),
    map((values: any) =>
      slice.actions.addAlertSuccess({ id: uuid(), ...values.payload })
    )
  );
export const addAlertEpic:Epic=(
行动$,
陈述$
) =>
动作$.pipe(
类型(slice.actions.addAlert),
映射((值:任意)=>
slice.actions.addAlertSuccess({id:uuid(),…values.payload})
)
);

谢谢你的帮助

为AddAlertSuccess添加另一个epic,包括延迟发送删除操作

export const addAlertSuccessEpic: Epic<Action, Action, RootState> = (
  action$,
  state$
) =>
  action$.pipe(
    ofType(slice.actions.addAlertSuccess),
    delay(myTimeToWait),
    map(foo =>
      slice.actions.removeAlert({ id: foo.id })
    )
  );
export const addAlertSuccessEpic:Epic=(
行动$,
陈述$
) =>
动作$.pipe(
类型(slice.actions.addAlertSuccess),
延迟(myTimeToWait),
地图(foo=>
slice.actions.removeAlert({id:foo.id})
)
);
设置警报,然后在设置的时间段后关闭同一警报[…]用户可以手动关闭一个警报,然后警报自动关闭

考虑到这一点,我的方法如下:

actions$.pipe(
类型(slice.actions.addAlert),
//`也可以在任何时候发出多个警报`
合并映射(操作=>{
常量id=uuid();
//使用'NEVER'很重要,它本质上与新的可观察(()=>{})相同
//之所以需要它,是因为我们不希望内部的可观察性完成,除非“takeUntil”决定这样做
永不回头
.烟斗(
//从打开警报开始
startWith(slice.actions.addAlertSuccess({id,…action.payload}))
//关闭警报
takeUntil(合并)(
//当“时间”过期时
计时器(时间),
//或者当用户决定
userClosedActions.pipe(
过滤器(action=>action.id==id)
)
)),
//在结束时(当流由于“takeUntil”而完成时),关闭警报
endWith(slice.actions.closeAlertSuccess(…)
)
})
)
userClosedActions
可以是一个
主题
,作为用户操作的结果发送
next
通知。例如:

onClick(closedId){
userClosedActions.next({id:closedId})
}

感谢Andrei的详细回答。我如何创建一个主题并将其与我的史诗联系起来?或者你能给我指出正确的方向吗?@ChyMeng我不确定在这种情况下最好的方法是什么(在Angular中是依赖注入),但我会在epic驻留的同一文件中创建主题,然后你可以将其导入组件中