2017-09-29 3 views
1

Je viens de commencer à utiliser Redux-Observable. Je veux faire une épopée générique qui demande des données du serveur. Je souhaite que plusieurs requêtes avec la même action et l'identifiant soient débattues. Cependant, je ne suis pas sûr de savoir comment faire cela sans créer plusieurs épopées.Générique Epic utilisant 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')))); 

Comment est-il possible de créer une épopée générique qui se base sur l'action et l'identifiant?


Mise à jour: Je n'ai jamais entendu parler de GroupBy. Cela a bien fonctionné avec switchMap. Ce qui suit a été utilisé.

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'))) 
      ); 
    ) 

Répondre

3

Vous pouvez utiliser l'opérateur groupBy:

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'))) 
      ); 
    ) 

Le actionByIdGroup $ est un Groupés Observable des mêmes ids d'action. Cela signifie que seules les actions ayant le même identifiant feront partie du même flux. Dans ce cas, le debounceTime sera appliqué pour les actions ayant le même ID.