2017-09-29 15 views
1

Redux-Observableを使い始めました。私はサーバーからデータを要求する一般的な叙事詩を作りたいと思う。私は、同じアクションとIDを持つ複数のリクエストをデバッグする必要があります。しかし、私は複数の叙事詩を作成せずにこれを行う方法がわかりません。Redux-Observableを使用した汎用エピック

const TYPE_IFEXISTS_REQUEST = 'IFEXISTS_REQUEST'; 
export const IFEXISTS_REQUEST = (id, value) => 
    ({ type: TYPE_IFEXISTS_REQUEST, id, value }); 
export const IFEXISTS_EPIC = action$ => 
    action$ 
    .ofType(TYPE_IFEXISTS_REQUEST) 
    .debounceTime(5000) // ERROR: debounces based on action type and not id 
    .mergeMap(action => 
     fromPromise(api.get(`/api/exists/${action.id}/${action.value}`)) 
     .map(({ data }) => IFEXISTS_SUCCESS(action.id, data)) 
     .catch(() => of(IFEXISTS_FAILURE(action.id, 'Server error')))); 

アクションとIDの両方に基づいてデバウンする一般的な叙事詩を作成するにはどうすればよいですか?


更新:GroupByについては決して知らなかった。それはswitchMapとうまくいった。以下は私が使用したものです。

actionByIdGroup $
action$ 
    .ofType(TYPE_IFEXISTS_REQUEST) 
    .groupBy(action => action.id) 
    .mergeMap(actionByIdGroup$ => 
     actionByIdGroup$ 
      .debounceTime(5000) // debounces based on action id 
      .mergeMap(action => 
       fromPromise(api.get(`/api/exists/${action.id}/${action.value}`)) 
        .map(({ data }) => IFEXISTS_SUCCESS(action.id, data)) 
        .catch(() => of(IFEXISTS_FAILURE(action.id, 'Server error'))) 
      ); 
    ) 

が同じアクションIDのグループ化された観察可能である:

action$ 
    .ofType(TYPE_IFEXISTS_REQUEST) 
    .groupBy(action => action.id) 
    .mergeMap(actionByIdGroup$ => 
     actionByIdGroup$ 
      .debounceTime(5000) // debounces based on action id 
      .switchMap(action => 
       fromPromise(api.get(`/api/exists/${action.id}/${action.value}`)) 
        .map(({ data }) => IFEXISTS_SUCCESS(action.id, data)) 
        .catch(() => of(IFEXISTS_FAILURE(action.id, 'Server error'))) 
      ); 
    ) 

答えて

3

あなたがgroupBy演算子を使用することができます。つまり、同じIDを持つアクションだけが同じストリームの一部になります。この場合、debounceTimeが同じIDを持つアクションに適用されます。

関連する問題