@effect()
public loadAccommodations$: Observable = this.actions$
.ofType(PAA.PROPERTY_LOAD_REQUEST)
// .debounce(300)
// introducing this mitigates the flood but does not resolve the issue
.switchMap((action: Action) => {
return this.propertyAccommodationsService.loadAccommodations(action.payload.id)
.takeUntil(this.loadAccommodations$)
.map((response: IResponseSuccess) => PAA.loadSuccess(action.payload, response))
.catch((error: Error) => {
const errorNotification = errorNotificationFactory(error.message);
this.notificationService(errorNotification)
return of( PAA.loadFailure() );
});
});
仅在我的效果多次拦截此操作后调度PAA.PROPERTY_LOAD_REQUEST,直到超出最大调用堆栈大小。
版本: " angular / core":" 2.4.6",
" @ ngrx / core":" ^ 1.2.0",
" @ ngrx / store":" ^ 2.2.1",
" @ ngrx / effects":" ^ 2.0.1",
" rxjs":" 5.0.2",
注意:效果仅在app.module中注册一次。
答案 0 :(得分:0)
@Effect
会自行调度一个动作。您的效果一次又一次地调度相同的Action,直到执行调用堆栈或调用返回。
您需要将dispatch: false
添加到效果装饰器:
@Effect({ dispatch: false })
或者你发出另一个动作:
.switchMap((action: Action) => {
this.propertyService.load(action.payload);
return Observable.of({ type: 'LOADING_DATA' });
});
答案 1 :(得分:0)
在我的情况下,问题是由这段代码中的takeUntil引起的:
return this.propertyAccommodationsService
.loadAccommodations(action.payload.id)
.takeUntil(this.loadAccommodations$)
通过调度2个PROPERTY_LOAD_REQUEST操作,第二个触发了takeUntil()运算符,导致多个效果调用。 在我的情况下,takeUntil(效果)是不必要的,所以我可以删除它,但仍然,我无法弄清楚为什么这个运算符导致运行多次效果。