为什么我的效果在调用操作后一直运行数十次?

时间:2018-08-30 23:16:21

标签: javascript angular ngrx ngrx-effects

我有这种要求服务器值从服务中检索产品的效果。调度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));

1 个答案:

答案 0 :(得分:0)

缺陷解决方案与Observable相关。在调试过程中,多次调用“ this.apiMarketServices.get(MARKETS_PROFILES + marketId)”,我发现该服务类似于缺陷原因:

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

但是真正的原因是stateSevice,该行为主题已在应用的其他部分中使用next更新。

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

为了避免这些调用,我创建了一个函数,以便从BehaviorSubject检索当前值。

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

我将此功能添加到每个派遣效果调用一次的效果中。

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