Redux-Angular:如何防止两次调用动作?

时间:2018-11-14 11:09:51

标签: angular typescript redux

Redux这是一个非常酷的库,我真的很喜欢它,但是如何防止两次调用该动作呢?哪些错误会导致这种行为? 考虑到我已经取消了订阅到控制器中

          constructor(private _store: Store<AppState>) {                                      
                 this.subscription = this._store.select('reduxObj').subscribe(function (item) {
                      switch (item.type) {    
                                  case fromAction.GETITEMS:{                                                                                                                               
                                        break;
                                  }
                      }                      
                }.bind(this));                            
          }

            ngOnDestroy(){
                  this.subscription.unsubscribe();                
            }


            ngOnInit() {                      
                  this._store.dispatch(new fromAction.GetListAction());
            }



//REDUCER
export function ReduxReducer(state: any = undefined, action: fromAction.actions){

      switch (action.type) {
            case fromAction.GETITEMS: {                  
                 return {...state,type: fromAction.GETITEMS }
            }
      }


//ACTION
export class GetListAction implements Action {
      readonly type = GETITEMS;
      constructor(){}
}

2 个答案:

答案 0 :(得分:1)

首先,您不需要.bind(this)来使用观察者功能。其次,您可以利用ES6箭头功能代替常规的javascript函数作为回调(() => {})。

关于您的问题-从Observable中仅获取一个值的最佳选择是将take()阶段添加到RxJS管道中,如下所示:

         this.subscription = this._store.select('reduxObj')
           .pipe(take(1))
           .subscribe((item) => {
              switch (item.type) {    
                case fromAction.GETITEMS:{                                                                                                        
                  //...                                    
                  break;
                }
              }
        }); 

要使用它,必须使用'rxjs / operators'导入,前提是您使用的是RxJS 5.5库或更高版本。

import { take } from 'rxjs/operators';

答案 1 :(得分:1)

人们似乎专注于琐碎的事情。

所以我将直接回答您的问题:

商店中的select以其最简单的实现侦听dispatch事件。

您致电dispatch两次,您的订​​阅被致电两次。

现在这可以随效果等而改变,但我假设您没有任何效果。

如果两次被调用,那是因为您的商店已使用默认值实例化。在减速器中的签名是

(state: MyState, action: MyAction implements Action) => any

通常,您这样说

myReducer(state: MyState = undefined, action: MyAction implements Action) { ... }

这意味着您的第一个值为undefined,如果您调用dispatch,则将定义第二个值。

这是两个电话来自的地方。

此外,您可以将其保留在构造函数中,这不会改变该死的事情。

编辑

要忽略第一个值,可以使用filterskip(不是一次全部,请根据需要选择一个):

this.subscription = this._store.select('reduxObj').pipe(
  // For an array, will ignore all empty arrays
  filter(value => value.length),
  // For undefined, will ignore all falsy values
  filter(value => !!value),
  // Ignore first value only
  skip(1),
)