ngrx 效果 - 问题 calling/stopping 每隔几秒有条件地效果

ngrx effects - problems calling/stopping effects conditionally every few seconds

我正在尽力启用我的 ngrx 效果,使用计时器按以下方式每 2 秒有条件地调用一次自身:

  @Effect()
  loadSummary$ = this.actions$
  .pipe(
    
    ofType(SummaryTypes.SAVE_SUMMARY),
    
    switchMap((action:any) => (action.running ? timer(0, 2000) : NEVER)),
    
    switchMap((action: any) => {

      console.log(action); /* prints 0 (how is this possible?!) */

      return this.analyticsService.getData(action.fetchArr, action.startAndEndDate).pipe(
        catchError((err) => {
          /* log error */
        }),
      )
    }),
  ) 

所以我每 2 秒调用第二个 switchMap。 action.running 在第一次 switchMap 调用中也正确 returns true 或 false,但是,console.log(action) returns 0 类似地,action.fetchArraction.startAndDate return未定义。

这是因为我无法 return 第一 action 到第二个动作。有人可以指导我做错了什么吗?

我想要的:

我希望我的效果每 2 秒调用一次,如果 action.running return 为 false 则它必须立即停止。 console.log(action); 应该正确 return 第二个传递的对象 switchMap 而不是 0.

我试过的:

尝试阅读最近几个小时的效果,甚至尝试使用 takeUntil 但无法找到任何特定方法。

嗨,我试过这样的东西并且成功了

  public someSubject = new Subject<boolean>();
  public someObes = from([1, 2, 3, 4]);

  ngOnInit() {
    this.someSubject
      .pipe(
        switchMap(
          (value: boolean): any =>
            timer(0, 200).pipe(
              filter(() => value),
              switchMap((): any => this.someObes)
            )
        )
      )
      .subscribe(value => console.log(value));

    this.someSubject.next(true);

    setTimeout(() => this.someSubject.next(false), 3 * 1000);

    setTimeout(() => this.someSubject.next(true), 5 * 1000);

    setTimeout(() => this.someSubject.next(false), 8 * 1000);
  }
}

我认为你应该 pipe timer(0, 2000)

为了真正解决你的误解: .console.log(action); /* prints 0 (how is this possible?!) */ 在switchMap中 在此步骤之前,您将切换到可观察计时器和 returns 一个 运行 数字。检查那里的动作类型。它只是不是你所期望的那样。

我认为这应该可以解决问题:

  switchMap((action: any) =>
        (action.running ? timer(0, 2000) : NEVER)
          .pipe(map(() => action))),
      switchMap((action: any) => { // now this is actually of type 'Action'
        console.log(action);