Angular ngxs调度调用多次订阅

时间:2019-02-14 05:00:55

标签: angular ngxs

我正在从一个组件分派数据以在其他组件中使用。 当我调度时,subscribe会多次调用。

点击按钮我正在发送

appStore.dispatch(new SetSearch(value));

我正在其他组件中列出

appStore.select<ISearch>(AppState.Search)
    .pipe(
      takeUntil(this.unsubscribe$), skip(1)
    )
      .subscribe(SearchState => {
        if (SearchState.account !== '') 

在此处调用方法进行保存。在该方法中,我正在调度以保存该值,在订阅时,我正在调用其他方法以加载数据并进行调度。

2 个答案:

答案 0 :(得分:0)

由于引入的状态更改(可能是重复的),您的嵌套订阅必须正在创建周期执行,然后由于值没有更改,周期结束。如果要在该订阅中分派其他操作,则这些操作可能会影响appStore的状态,因此会重新触发当前订阅以再次执行。在这种情况下,您将观察到多个订阅,直到您的商店不再对状态的其他更改做出反应。减速器中发生的操作类型决定了该循环可以持续多长时间。如果要设置字段并更改其值,则可能会看到两次调度,因为appStore从初始值更改为新值,并且由于嵌套在订阅中的调度,您会看到多个订阅事件。如果您在分派期间在化简器上使用其他形式的变异,则执行周期可能更长。缓解这种情况的方法是比较您的状态,并且如果您的状态已经采用正确的格式,则不会触发其他调度。您可以添加其他条件控制结构作为补救措施。

作为附录,如果您对分派有反应,那么这也可能触发其他订阅事件,从而导致订阅内部进一步执行。特别是如果您使用传统的订阅,则执行分派请求REQUEST->效果分派{SUCCESS | ERROR}操作也会修改您的状态,例如加载字段或错误标志。

答案 1 :(得分:0)