ngrx从生效开始多次调度相同的动作

时间:2018-10-31 22:31:56

标签: angular rxjs ngrx ngrx-effects

我有一个非常简单的问题,但是无法弄清楚我在做什么错-我在网上发现的所有解决方案似乎都不对我有用:

打开我的应用程序的特定部分时,将分派一个操作来从后端加载当前的item-Id列表。

一旦检索到此列表-我需要加载我刚刚获得ID的所有项目。

( GET /api/items -> [1,2] -> GET /api/items/1, GET /api/items/2)

我试图用这样的效果解决这个问题:

我选择了mergeMap,因为我想发出一系列动作,但是不关心它们的顺序。

这样做

@Effect() loadList$: Observable<LoadAction[]> = this.actions$.pipe(
    ofType<LoadListAction>(LOAD_LIST_ACTION),
    mergeMap( _ =>
      this.backendService.getItemIds().pipe(
        filter( it => it.items.length > 0),
        map(response => response.items.map(it => new LoadAction(it.id));
        )
      )
    )
  );

给我这个错误:

"invalid action was dispatched" [{"type":"[ITEMS][INIT] load item", "payload":"1"}, {"type":"[ITEMS][INIT] load item", "payload":"2"}],
 TypeError: Actions must have a type property

这很有意义,因为现在可观察对象直接发出数组,所以我切换到两次mergeMap:

@Effect() loadList$: Observable<LoadAction[]> = this.actions$.pipe(
    ofType<LoadListAction>(LOAD_LIST_ACTION),
    mergeMap( _ =>
      this.backendService.getItemIds().pipe(
        filter( it => it.items.length > 0),
        mergeMap(response => response.items.map(it => new LoadAction(it.id));
        )
      )
    )
  );

在这里,只有最后一个动作到达减速器(/api/items/2),第一个动作消失了,并且从未生效。 (我确认列表的长度为2)。

这是什么问题?

1 个答案:

答案 0 :(得分:0)

确保两个动作的Action.type不同,就我而言,我偶然将两个不同动作的type设置为相同。我很难调试它,但最终我能够找到问题。