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(){}
}
答案 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,则将定义第二个值。
这是两个电话来自的地方。
此外,您可以将其保留在构造函数中,这不会改变该死的事情。
要忽略第一个值,可以使用filter
或skip
(不是一次全部,请根据需要选择一个):
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),
)