2017-09-13 16 views
0
@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只有一次我的影响拦截此动作多次,直到超过最大调用堆栈大小后。单动调度结果exceded

版本: “角/芯”: “2.4.6”,

“@ NGRX /芯”: “^ 1.2.0”,

“@ NGRX /存储”:“^ 2.2.1" ,

“@ NGRX /效应”: “^ 2.0.1”,

“rxjs”: “5.0.2”,

注:作用在应用程序注册只有一次.module。

回答

0

@Effect发送一个Action本身。您的效果会一次又一次地分派相同的操作,直到调用堆栈被执行或者调用返回。

您需要添加dispatch: false的效果装饰:

@Effect({ dispatch: false }) 

或者你发送另一个动作:

.switchMap((action: Action) => { 
    this.propertyService.load(action.payload); 
    return Observable.of({ type: 'LOADING_DATA' }); 
}); 
+0

谢谢大卫,我更新了这个问题。我没有派遣相同的动作(loadRequest),而是两种不同的动作之一(loadSuccess或loadFailure)。 – Sasha

+0

现在它是否工作?还是有另一个问题?你如何派遣你的行动? – David

+0

不,它不起作用,因为我说我的效果会返回一个与触发器动作完全无关的动作。 – Sasha

0

在我的情况下,问题是由takeUntil在这段代码引起的:

return this.propertyAccommodationsService 
    .loadAccommodations(action.payload.id) 
    .takeUntil(this.loadAccommodations$) 

通过调度2个PROPERTY_LOAD_REQUEST动作,第二个动作触发了t导致多个效果调用的akeUntil()运算符。 在我的情况下,takeUntil(效果)是不必要的,所以我可以删除它,但仍然,我不明白为什么这个运算符导致多次运行效果。