J'écris ceci pour savoir si je comprends bien ou non.L'interrogation de conception sur l'utilisation correcte de la notion de «effet secondaire» de ngrx/effets
Sur exemples trouvés en ligne, le modèle va généralement comme ceci (exemple ici sur ajouter/supprimer des actions sur l'état et sur une base de données distante):
effects.ts:
@Effect()
add$ = this.action$
.ofType(ADD)
.switchMap((action: Action) => {
return this.http.put(...)
.map(response => response.json())
.map(response => Observable.of({ type: ADD_SUCCESS, payload: action.payload }))
.catch(response => Observable.of({ type: ADD_FAIL, payload: response.status }))
réducteur
. ts
...
switch (action.type){
case 'ADD_SUCCESS':
...
return new_state;
case 'ADD_FAIL':
return state;
}
Il fonctionne, mais la vitesse d'exécution que ressentie par l'utilisateur dépend de la vitesse du réseau est. Alors je suis venu avec un motif que les paris sur la forte probabilité qu'aucune erreur ne sera retourné de l'API:
reducer.ts
...
switch (action.type){
case 'ADD':
... // make the adequate addition
return new_state;
case 'ADD_FAIL':
... // delete the addition previously made
return new_state;
}
effects.ts:
@Effect()
add$ = this.action$
.ofType(ADD)
.switchMap((action: Action) => {
return this.http.put(...)
.map(response => response.json())
.catch(response => Observable.of({ type: ADD_FAIL, payload: action.payload }))
Dans ce pattern, l'action d'enregistrer dans la base de données est vraiment un "effet secondaire". Dans le cas improbable mais possible où l'API renvoie une erreur, une deuxième action est effectuée pour annuler la première action.
Mais je n'ai pas encore trouvé ce design dans les exemples donnés en ligne: Puisque je suis un développeur amateur, je me demande si j'ai raté quelque chose qui le rend mal/dangereux/inefficace à la fin.
Merci Tyler pour votre réponse rapide et précise. Je suis d'accord dans les exemples que vous donnez que le design classique est meilleur. Dans la conception proposée et pour les données non critiques en jeu (comme dans mon projet), je vais travailler à donner l'interface utilisateur appropriée à l'utilisateur afin qu'il/elle comprenne que son action n'a pas eu lieu. – guenam