NGRX Effects:如何单独调度多个动作并延迟其中一个?
解决方案:拆分立即动作与延迟动作并合并流
你遇到的核心问题是第二个switchMap会等待第一个延迟流完成后才会触发后续动作,导致所有操作都被拖慢了5秒。要实现“部分动作立即调度、单个动作延迟调度”的需求,我们可以把两类动作拆分开,再通过RxJS的操作符合并成一个可观察流,这样就能各自按照预期的时机执行。
正确代码示例
@Effect() bookingSuccess$: Observable<Action> = this.actions$.pipe( ofType(BookingActionTypes.BOOK_SEAT_SUCCESS), map((action: BookSeatSuccess) => action.payload.userUuid), switchMap(userUuid => { // 1. 定义需要立即执行的动作数组 const immediateActions = [ new SetConfirmation({confirmationType: ConfirmationType.Booking}), new GetAllBookings({floorId: this.configService.getSelectedFloorId()}) ]; // 2. 定义需要延迟执行的动作(包装成带delay的Observable) const delayedHighlightAction = of( new HighlightUser({highlightedUser: userUuid}) ).pipe(delay(5000)); // 3. 合并两个流:立即动作通过from转成Observable,和延迟流并行执行 return merge( from(immediateActions), delayedHighlightAction ); }) );
为什么这个写法能生效?
from(immediateActions):把动作数组转换成Observable,会立即依次发出数组里的每个动作,触发调度。delayedHighlightAction:通过delay(5000)让这个动作的发出时间推迟5秒。merge操作符:会同时订阅两个Observable,互不干扰——立即动作马上执行,延迟动作到点再执行,完美匹配你的需求。
为什么你原来的写法不行?
你之前的代码逻辑是:先等待5秒发出HighlightUser,再在第二个switchMap里发出另外两个动作。这相当于把所有动作的执行时机都绑定到了延迟操作的完成时间上,自然会导致所有动作都被延迟。而我们现在的写法是把两类动作的流分开,让它们各自独立执行,就解决了这个问题。
内容的提问来源于stack exchange,提问作者JockelzF
相关产品推荐
相关产品推荐

