Rxjs 在ngrx中为效果分派添加计时器
我有以下效果Rxjs 在ngrx中为效果分派添加计时器,rxjs,ngrx,Rxjs,Ngrx,我有以下效果 addItem$ = createEffect(() => this.actions$.pipe( ofType(SkusActions.addItemRequest), concatMap(({ payload, redirectTo }) => this.dataService.addItem(payload).pipe( map(({ data }) => dat
addItem$ = createEffect(() =>
this.actions$.pipe(
ofType(SkusActions.addItemRequest),
concatMap(({ payload, redirectTo }) =>
this.dataService.addItem(payload).pipe(
map(({ data }) =>
data
? SkusActions.addItemSuccess(payload))
: SkusActions.addItemFailure({})
),
catchError((error) => of(SkusActions.addItemFailure(error)))
)
)
)
);
因为我使用的是graphql,所以我必须确保查询成功或失败(查询可能会出错,但graphql中有错误,因此没有数据字段)
现在,如果一切正常,我想在addItemSuccess
点火前添加一个3秒的计时器
我试过了
addItem$ = createEffect(() =>
this.actions$.pipe(
ofType(SkusActions.addItemRequest),
concatMap(({ payload, redirectTo }) =>
this.dataService.addItem(payload).pipe(
map(({ data }) =>
data
? timer(3000).pipe(mapTo(SkusActions.addItemSuccess(payload)))
: SkusActions.addItemFailure({})
),
catchError((error) => of(SkusActions.addItemFailure(error)))
)
)
)
);
但是它说类型不匹配。
SkusActions.addItemFailure({})
返回一个动作(javascript对象),而计时器(3000)。管道(…)
返回一个可观察的对象
因此,您应该改用switchMap
(或者concatMap
或者mergeMap
也可以),并始终返回可观察的:
switchMap(({ data }) => data
? timer(3000).pipe(mapTo(SkusActions.addItemSuccess(payload)))
: of(SkusActions.addItemFailure({}))
),
switchMap
不应作为默认建议。OP最终可能会丢失操作,这取决于addItem()
所做的操作,例如,如果这只是一个HTTP请求,那么这并不重要。在这种情况下可能是这样,但我认为这不应该是默认操作,尤其是当人们可能不知道它们之间的差异时