examples content angular redux ngrx

examples - ng-content select angular 4



despacha mĂșltiples acciones en un efecto (4)

Puede elegir mergeMap for async o concatMap for sync

@Effect() action$ = this.actions$ .ofType(CoreActionTypes.MY_ACTION) .mergeMap(() => Observable.from([{type: "ACTION_ONE"} , {type: "ACTION_TWO"}])) .catch(() => Observable.of({ type: CoreActionTypes.MY_ACTION_FAILED }));

Me gustaría diapatch dos acciones en un solo efecto. Actualmente tengo que declarar dos efectos para lograr esto:

// first effect @Effect() action1$ = this.actions$ .ofType(CoreActionTypes.MY_ACTION) .map(res => { return { type: "ACTION_ONE"} }) .catch(() => Observable.of({ type: CoreActionTypes.MY_ACTION_FAILED })); // second effect @Effect() action2$ = this.actions$ .ofType(CoreActionTypes.MY_ACTION) .map(res => { return { type: "ACTION_TWO"} }) .catch(() => Observable.of({ type: CoreActionTypes.MY_ACTION_FAILED }));

¿Es posible tener una acción, ser la fuente de dos acciones a través de un solo efecto?


Puedes usar switchMap y Observable.of .

@Effect({ dispatch: true }) action$ = this.actions$ .ofType(CoreActionTypes.MY_ACTION) .switchMap(() => Observable.of( // subscribers will be notified {type: ''ACTION_ONE''} , // subscribers will be notified (again ...) {type: ''ACTION_TWO''} )) .catch(() => Observable.of({ type: CoreActionTypes.MY_ACTION_FAILED }));

El rendimiento importa:

En lugar de enviar muchas acciones que activarán a todos los suscriptores tantas veces como usted envíe , es posible que desee echar un vistazo a redux-batched-actions .

Esto le permite advertir a sus suscriptores solo cuando todas esas múltiples acciones se han aplicado a la tienda.

Por ejemplo :

@Effect({ dispatch: true }) action$ = this.actions$ .ofType(CoreActionTypes.MY_ACTION) // subscribers will be notified only once, no matter how many actions you have // not between every action .map(() => batchActions([ doThing(), doOther() ])) .catch(() => Observable.of({ type: CoreActionTypes.MY_ACTION_FAILED }));


también puedes usar .do () y store.next ()

do le permite adjuntar una devolución de llamada al observable sin afectar a los otros operadores / cambiar el observable

p.ej

@Effect() action1$ = this.actions$ .ofType(CoreActionTypes.MY_ACTION) .do(myaction => this.store.next( {type: ''ACTION_ONE''} )) .switchMap((myaction) => Observable.of( {type: ''ACTION_TWO''} )) .catch(() => Observable.of({ type: CoreActionTypes.MY_ACTION_FAILED }));

(necesitarás una referencia a la tienda en tu clase de efectos)


@Effect() loadInitConfig$ = this.actions$ .ofType(layout.ActionTypes.LOAD_INIT_CONFIGURATION) .map<Action, void>(toPayload) .switchMap(() => this.settingsService .loadInitConfiguration() .mergeMap((data: any) => [ new layout.LoadInitConfigurationCompleteAction(data.settings), new meetup.LoadInitGeolocationCompleteAction(data.geolocation) ]) .catch(error => Observable.of( new layout.LoadInitConfigurationFailAction({ error }) ) ) );