首页 > 解决方案 > ngrx 效应 - 等待外部数据

问题描述

我有一个效果,当用户下载并存储在状态时运行:

getMetadata$ = createEffect(() => {
  return this.actions$.pipe(
    ofType(fromUserSelectors.getUserSuccess),
    concatLatestFrom(() => this.store.select(fromProductSelectors.selectProduct)),
    exhaustMap(([user, product]) =>
      // do something with user and product
    )
  );
});

getUserSuccess派发时会触发此效果。

但是,您可以在第 4 行看到,我还需要存储在不同商店中并与正在下载的用户异步下载的产品。所以它不一定会在以后填充。

我怎样才能告诉这种效果在恢复之前等待产品填充?我不想重新触发效果。我以为这是concatLatestFromngrx v12引入的目的,但也许我误解了。

我知道我可以在我的ofType通话中收听多个动作并收听fromProductSelectors.getProductSuccess,但我只希望此效果在getUserSuccess被调用时运行,而不是fromProductSelectors.getProductSuccess太多,但需要selectProduct不未定义。

标签: asynchronousngrxngrx-effects

解决方案


您可以使用filter运算符等待它可用。

getMetadata$ = createEffect(() => {
  return this.actions$.pipe(
    ofType(fromUserSelectors.getUserSuccess),
    concatLatestFrom(() => this.store.select(fromProductSelectors.selectProduct).pipe(filter(x => !!x)),
    exhaustMap(([user, product]) =>
      // do something with user and product
    )
  );
});

推荐阅读