Почему мой эффект запускается несколько раз после вызова действия?

У меня есть такой эффект, что я запрашиваю несколько значений для извлечения продукта из службы. После отправки REQUEST_PRODUCTS вызывается один раз, как и ожидалось, но когда я пытался перейти в другое место в маршрутизации, this.apiMarketServices вызывается серверами раз, это триггер перехода маршрутизатора, и это перенаправляет на предыдущую страницу. Действие REQUEST_PRODUCTS отправляется один раз. Почему этот эффект называется несколькими временами?

Нужно ли мне добавлять какой-то стоп к эффекту, чтобы избежать вызова после возврата GetSuccess и GetFailed?

@Effect()
   requestProductsFromMarket = this.actions$
   .ofType(REQUEST_PRODUCTS)
   .withLatestFrom(this.store)
   .switchMap(([action, store]) => {
     const id = store.product.id;
     return this.savedProducts.getProduct(id, 'store');
   })
   .switchMap(_ => this.stateService.getMarketId())
   .switchMap(({ marketId }) =>
     this.apiMarketServices.get(MARKETS_PROFILES + marketId)
   )
   .withLatestFrom(this.store)
   .map(([r, store]) => {
     const ser = r.data.map(s => s.legId);
     const storSer =
       store.product.serIds;
     if (storSer.every(s =>ser.includes(s))) {
        this.router.navigate([
          `/products/edit/${store.products.id}`
        ]);
        return GetSuccess;
    } else {
       return GetFailed;
    }
  })
  .catch(() => of(GetQueryFailed));

person Tabares    schedule 30.08.2018    source источник
comment
Я могу справиться с оператором first (), добавленным после последнего switchMap, Promise, который называется servaral times, но работает только один раз. После повторного звонка с рассылкой эффект не работает.   -  person Tabares    schedule 01.09.2018


Ответы (1)


Решение для дефекта связано с Observable. При отладке несколько раз вызывался this.apiMarketServices.get (MARKETS_PROFILES + marketId), эти службы я определил как причину дефекта:

.switchMap(({ marketId }) =>
    this.apiMarketServices.get(MARKETS_PROFILES + marketId)
 )

Но настоящая причина была в stateSevice, эта тема поведения была обновлена ​​следующей, в других частях приложения.

.switchMap(_ => this.stateService.getMarketId())

Чтобы избежать этих вызовов, я создал функцию для получения текущего значения из BehaviorSubject.

getCurrentMarketId(): ClientData {
   return this.currentMarket.value; // BehaviorSubject
 }

Я добавил эту функцию к тому, что вызов выполняется один раз для каждого отправленного эффекта.

 ...
 .switchMap(([action, store]) => {
    const id = store.product.id;
    return this.savedProducts.getProduct(id, 'store');
 })
 .map(_ => this.stateService.getCurrentMarketId())
 .switchMap(({ marketId }) =>
    this.apiMarketServices.get(MARKETS_PROFILES + marketId)
 )
person Tabares    schedule 07.09.2018