Redux Observable:如何在 flatMap 中使用 takeUntil?
Redux Observable: How to use takeUntil inside flatMap?
我有一个平面图,目的是发出两个动作:
export default function searchForPartner(action$, store) {
return action$.ofType(statusActions.SEARCH_FOR_PARTNER)
.filter(() => store.getState().user.signedIn)
.delay(2000)
.flatMap(() => [
carouselActions.slideTo(config.CAROUSEL_SLIDES.CONFIRM_CHAT),
statusActions.foundPerson(),
])
.takeUntil(action$.ofType(carouselActions.TAP_CANCEL))
};
然而,takeUntil
放错了位置。当 TAP_CANCEL
发出时,它正在取消整个史诗。相反,我只希望它取消 flatMap
内的动作的发射。我该怎么做?
===更新===
我胡思乱想了,这似乎行得通?但我不喜欢有 2 个计时器:
export default function searchForPartner(action$, store) {
return action$.ofType(statusActions.SEARCH_FOR_PARTNER)
.filter(() => store.getState().user.signedIn)
.mergeMap(() =>
Observable.merge(
Observable.timer(2000)
.map(() => carouselActions.slideTo(config.CAROUSEL_SLIDES.CONFIRM_CHAT)),
Observable.timer(2000)
.map(() => statusActions.foundPerson())
)
.takeUntil(action$.ofType(carouselActions.TAP_CANCEL))
)
};
你需要将 delay
和 takeUntil
隔离到内部 Observable 中,最重要的是你启动 delay
计时器,然后 takeUntil
它,这样如果有人取消它,您肯定会收听——如果您的 delay
在外面,您还不会收听取消操作!这很微妙,但对于理解原因很重要。
export default function searchForPartner(action$, store) {
return action$.ofType(statusActions.SEARCH_FOR_PARTNER)
.filter(() => store.getState().user.signedIn)
.flatMap(() =>
Observable.of(
carouselActions.slideTo(config.CAROUSEL_SLIDES.CONFIRM_CHAT),
statusActions.foundPerson()
)
.delay(2000)
.takeUntil(action$.ofType(carouselActions.TAP_CANCEL))
);
}
您可能还想考虑使用 switchMap
而不是 flatMap
(又名 mergeMap
),因为如果另一个 SEARCH_FOR_PARTNER
在前一个还在等待时进来,您他们会排成一排。可能不想要你想要的,但你必须打电话。
我有一个平面图,目的是发出两个动作:
export default function searchForPartner(action$, store) {
return action$.ofType(statusActions.SEARCH_FOR_PARTNER)
.filter(() => store.getState().user.signedIn)
.delay(2000)
.flatMap(() => [
carouselActions.slideTo(config.CAROUSEL_SLIDES.CONFIRM_CHAT),
statusActions.foundPerson(),
])
.takeUntil(action$.ofType(carouselActions.TAP_CANCEL))
};
然而,takeUntil
放错了位置。当 TAP_CANCEL
发出时,它正在取消整个史诗。相反,我只希望它取消 flatMap
内的动作的发射。我该怎么做?
===更新===
我胡思乱想了,这似乎行得通?但我不喜欢有 2 个计时器:
export default function searchForPartner(action$, store) {
return action$.ofType(statusActions.SEARCH_FOR_PARTNER)
.filter(() => store.getState().user.signedIn)
.mergeMap(() =>
Observable.merge(
Observable.timer(2000)
.map(() => carouselActions.slideTo(config.CAROUSEL_SLIDES.CONFIRM_CHAT)),
Observable.timer(2000)
.map(() => statusActions.foundPerson())
)
.takeUntil(action$.ofType(carouselActions.TAP_CANCEL))
)
};
你需要将 delay
和 takeUntil
隔离到内部 Observable 中,最重要的是你启动 delay
计时器,然后 takeUntil
它,这样如果有人取消它,您肯定会收听——如果您的 delay
在外面,您还不会收听取消操作!这很微妙,但对于理解原因很重要。
export default function searchForPartner(action$, store) {
return action$.ofType(statusActions.SEARCH_FOR_PARTNER)
.filter(() => store.getState().user.signedIn)
.flatMap(() =>
Observable.of(
carouselActions.slideTo(config.CAROUSEL_SLIDES.CONFIRM_CHAT),
statusActions.foundPerson()
)
.delay(2000)
.takeUntil(action$.ofType(carouselActions.TAP_CANCEL))
);
}
您可能还想考虑使用 switchMap
而不是 flatMap
(又名 mergeMap
),因为如果另一个 SEARCH_FOR_PARTNER
在前一个还在等待时进来,您他们会排成一排。可能不想要你想要的,但你必须打电话。