I have a service with a subject:
@Injectable() export class UserService() {
private currentUserSubject = new BehaviorSubject<User>(null);
public currentUser = this.currentUserSubject.asObservable().distinctUntilChanged();
... // emitting new User
}
Have a component I inject this service into and subscribing on updates:
@Component() export class UserComponent {
constructor(private userService: UserService) {
this.userService.currentUser
.subscribe((user) => {
// I want to see not null value here
})
}
}
I want to apply something to Observable<User> to filter all null values and get into subscribe only when User is actually loaded.
Add a filter operator to your observable chain. You can filter nulls explicitly or just check that your user is truthy - you will have to make that call depending on your needs.
Filtering out null users only:
public currentUser = this.currentUserSubject
.asObservable()
.filter(user => user !== null)
.distinctUntilChanged();
Another way to check the value exists:
public currentUser = this.currentUserSubject
.asObservable()
.filter<User>(Boolean)
.distinctUntilChanged();
with rxjs@6 and typescript the recommended (readable/maintainable) way is to define the following type guard:
export function isNonNull<T>(value: T): value is NonNullable<T> {
return value != null;
}
and augment a subject with pipe and filter:
subject.pipe(filter(isNonNull))