Отправка одного действия приводит к вызову нескольких эффектов до тех пор, пока не будет превышен максимальный размер стека вызовов

@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.


person Sasha    schedule 13.09.2017    source источник


Ответы (2)


@Effect действительно отправляет действие. Ваш Эффект отправляет одно и то же действие снова и снова, пока либо стек вызовов не будет завершен, либо вызов не вернется.

Вам нужно добавить dispatch: false в декоратор эффектов:

@Effect({ dispatch: false })

Или вы отправляете другое действие:

.switchMap((action: Action) => {
    this.propertyService.load(action.payload);
    return Observable.of({ type: 'LOADING_DATA' });
});
person David    schedule 13.09.2017
comment
Спасибо Дэвид, обновил проблему. Я отправил не одно и то же действие (loadRequest), а одно из двух разных действий (loadSuccess или loadFailure). - person Sasha; 13.09.2017
comment
Так работает сейчас или нет? Или есть другая проблема? Как вы отправляете свое действие? - person David; 13.09.2017
comment
Нет, это не работает, как я уже сказал, мой эффект возвращает одно действие, совершенно не связанное с действием триггера. - person Sasha; 14.09.2017
comment
Ну ладно, значит, с вашим Эффектом все в порядке. Как и куда вы отправляете действие? - person David; 14.09.2017

В моем случае проблема была вызвана takeUntil в этом фрагменте кода:

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

Отправив 2 действия PROPERTY_LOAD_REQUEST, второе инициировало оператор takeUntil (), что привело к вызовам нескольких эффектов. В моем случае takeUntil (effect) не нужен, поэтому я могу удалить его, но все же я не могу понять, почему этот оператор приводит к многократному запуску эффекта.

person Sasha    schedule 15.09.2017