redux 为什么在使用takeWhile轮询后未调度我的操作

7lrncoxx  于 2022-12-13  发布在  其他
关注(0)|答案(1)|浏览(126)

我有一个由myFirstAction触发的Angular 效果,它应该进行轮询,直到在后端创建了一个文件,然后调度另一个操作:

myEffect = createEffect(() =>
    this.actions$.pipe(
      ofType(Actions.myFirstAction),
      withLatestFrom(
        this.store.select(Selectors.fileName)
      ),
      switchMap(([payload, fileName]) =>
          this.pollTillFileCreated(fileName)),
        map(() => Actions.mySecondAction()),
        catchError((error) => {
           return of(Actions.errorAction(error));
        })
      )
    );

我的投票方式是

private pollTillFileCreated(fileName: string): Observable<boolean> {
    return timer(0, 1000).pipe(
      concatMap(() => this.service.fileExist(fileName)),
      takeWhile((doesExist: boolean) => !doesExist),
      takeLast(1)
    );
  }

虽然我可以看到HTTP调用返回doesExist: true,但mySecondAction没有被调度。

x6492ojm

x6492ojm1#

简短的回答是我需要添加inclusive: true

takeWhile((doesExist: boolean) => !doesExist, true),

对我的问题的解释是,在我的简单情况下,我的文件在后端快速生成,所以第一次轮询将返回true。因此,它将是第一次也是最后一次轮询。当使用takeWhile而不使用inclusive: true时,它将不会继续运行,直到 predicate 返回false,并且不会包含它。在这种情况下,takeLast(1)将没有任何东西可取,因为我们排除了最后一个(也是第一个)。这样我们就不会返回任何东西,所以没有任何东西可传递给map

相关问题