我有一个由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没有被调度。
1条答案
按热度按时间x6492ojm1#
简短的回答是我需要添加
inclusive: true
:对我的问题的解释是,在我的简单情况下,我的文件在后端快速生成,所以第一次轮询将返回
true
。因此,它将是第一次也是最后一次轮询。当使用takeWhile而不使用inclusive: true
时,它将不会继续运行,直到 predicate 返回false,并且不会包含它。在这种情况下,takeLast(1)将没有任何东西可取,因为我们排除了最后一个(也是第一个)。这样我们就不会返回任何东西,所以没有任何东西可传递给map
。