I have a spinner I want the spinner to wait for x number of seconds before it is shown. However if REQUEST_DEACTIVATE_SPINNER is called during the time the spinner is waiting for the timeout to complete, it should stop the ACTIVATE_SPINNER action from being fired. Aka I would like to cancel the active timer. This is what I have so far.
@Effect() spinnerActive$ = this.actions$
.ofType(REQUEST_ACTIVATE_SPINNER, REQUEST_DEACTIVATE_SPINNER)
.switchMap(action => {
// create a timer and return it active event sent when timer completes
if (action.type === REQUEST_ACTIVATE_SPINNER) {
timer$ = Observable.timer(action.payload.delay || 0)
.switchMap(() =>
Observable.of({type: ACTIVATE_SPINNER})
);
}
if (action.type === REQUEST_DEACTIVATE_SPINNER) {
// check to see if a timer is running if it is cancel it
if (timer$) {
// cancel the timer
}
return Observable.of({type: DEACTIVATE_SPINNER});
}
});
Could some body possibly show we how to cancel a timer that is being returned to an Effect.
You should be able to solve your problem using the takeUntil
operator.
You could use it to complete the observable in the switchMap
for the REQUEST_ACTIVATE_SPINNER
effect when a REQUEST_DEACTIVATE_SPINNER
action is received.
Note that there are now two effects, as the REQUEST_DEACTIVATE_SPINNER
effect is now independent of the REQUEST_ACTIVATE_SPINNER
effect:
@Effect() spinnerActive$ = this.actions$
.ofType(REQUEST_ACTIVATE_SPINNER)
.switchMap(action => Observable
.timer(action.payload.delay || 0)
.takeUntil(this.actions$.ofType(REQUEST_DEACTIVATE_SPINNER))
.switchMap(() => Observable.of({ type: ACTIVATE_SPINNER })
);
@Effect() spinnerDeactive$ = this.actions$
.ofType(REQUEST_DEACTIVATE_SPINNER)
.switchMap(action => Observable.of({ type: DEACTIVATE_SPINNER }));
Also, the some of the switchMap
operators are unnecessary and could be replaced with mapTo
:
@Effect() spinnerActive$ = this.actions$
.ofType(REQUEST_ACTIVATE_SPINNER)
.switchMap(action => Observable
.timer(action.payload.delay || 0)
.takeUntil(this.actions$.ofType(REQUEST_DEACTIVATE_SPINNER))
.mapTo({ type: ACTIVATE_SPINNER })
);
@Effect() spinnerDeactive$ = this.actions$
.ofType(REQUEST_DEACTIVATE_SPINNER)
.mapTo({ type: DEACTIVATE_SPINNER });
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With