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请求,那么这并不重要。在这种情况下可能是这样,但我认为这不应该是默认操作,尤其是当人们可能不知道它们之间的差异时