What Is This "Tap" Thing In Rxjs?

In the bank of Jordan river, in the Moab land, Moses wished to explain his testament and what is he said:
I’m looking at great angular-ngrx-material-starter repo of great guy named Tom Trajan
And here is the code of “auth.effects” file, where you can clear see the usage of “tap” operator:



@Effect({ dispatch: false })
login(): Observable {
return this.actions$
.ofType(AuthActionTypes.LOGIN)
.pipe(
tap(action => // <-- see the "tap" thing here?
this.localStorageService.setItem(AUTH_KEY, { isAuthenticated: true })
)
);
}

So what is this “tap”(lettable operator) thing doing???

Documentation

When looking into rxjs docs you can see that “tap” is newer version of “do” operator.
Also you can see following sentence: invokes an action upon graceful or exceptional termination of the observable sequence.
That means – if you want something to be done regardless of outcome of observable you can do it with “tap”

Example

All the places in he code which only taking care of storing the payload(and not trying to modify the outcome of observable ) in the localstorage making usage if “tap”:



@Effect({ dispatch: false })
persistTodos(): Observable {
return this.actions$
.ofType(TodosActionTypes.PERSIST)
.pipe(
tap((action: ActionTodosPersist) =>
this.localStorageService.setItem(TODOS_KEY, action.payload.todos)
)
);
}

When observable outcome is somehow modified – the “map” operator comes to the stage:



@Effect()
loadPizzas$ = this.actions$.ofType(pizzaActions.LOAD_PIZZAS).pipe(
switchMap(() => {
return this.pizzaService
.getPizzas()
.pipe(
map(pizzas => new pizzaActions.LoadPizzasSuccess(pizzas)),
catchError(error => of(new pizzaActions.LoadPizzasFail(error)))
);
})
);

You may also like...