2016-12-02 17 views
1

ngrx/effectsを理解しようとしています。私は、クリックごとに1ずつインクリメントする単純な関数を構築しました。しかし、それはクリックされると無限ループになり、何が起きているのかはわかりません。私はいくつかばかげた間違いをしていると確信しています。ngrx/effectsを含む無限ループ

monitor.effects.ts

@Injectable() 
export class MonitorEffects { 
    @Effect() 
    compute$: Observable<Action> = this.actions$ 
     .ofType(monitor.ActionTypes.INCREMENT) 
     .map((action: monitor.IncrementAction) => action.payload) 
     .switchMap(payload => { 
      return this.http.get('https://jsonplaceholder.typicode.com/users') 
      .map(data => new monitor.IncrementAction(payload+1)) 
      .catch(err => of(new monitor.InitialAction(0))) 
     }); 

    constructor(private actions$: Actions, private http:Http) {}; 
} 

monitor.component.ts

ngOnInit() { 
    this.storeSubsciber = this 
     .store 
     .select('monitor') 
     .subscribe((data: IMonitor.State) => { 
     this.value = data.value; 
     this.errorMsg = data.error; 
     this.currentState = data.currentState; 
     }); 
    } 

    increment(value: number) { 
    this.store.dispatch(new monitorActions.IncrementAction(value)); 
    } 

monitor.reducer.ts

export const monitorReducer: ActionReducer<IMonitor.State> = (state = initialState, action: Actions) => { 
    switch (action.type) { 
    case ActionTypes.INCREMENT: 
     return Object.assign({}, { value: action.payload, currentState: ActionTypes.INCREMENT, error: null }); 
... 
... 
... 

    default: 
     return Object.assign({}, { value: 0, currentState: ActionTypes.INITIAL, error: null }); 
    } 
} 
+0

あなたがアクション '.ofType(monitor.ActionTypes.INCREMENT)'を見て、あなたのエフェクトから 'monitor.ActionTypes.INCREMENT'アクションをディスパッチします(この部分から' monitor.IncrementAction(payload + 1) ')、エフェクトが再びトリガされ、再び、そして再び、... – Maxime

+0

はい、それは問題でした。どうもありがとうございました! – Sudhakar

+0

私は誰かが似たような問題を抱えていて、あなたの事例から理解できない場合に備えて適切な答えを出しました。うーん、それはあなたのプロジェクトに取り組んでいます!どういたしまして :) – Maxime

答えて

4

Effect指定したアクションの種類を見ることができますし、それが発送されるたびにその行動に反応する。

あるアクションでアクションXを見て、そのアクションから別のアクションXをディスパッチすると、無限ループに終わります。あなたのケースでは

:あなたのアクションは、タイプ.ofType(monitor.ActionTypes.INCREMENT)であり、あなたの効果からあなたがして(私は仮定し、この部分から:monitor.IncrementAction(payload+1))アクションmonitor.ActionTypes.INCREMENTを派遣し、効果が再び、そして再び、そして再びトリガされ、...