web-dev-qa-db-fra.com

Filtrer toutes les valeurs «nulles» d'un <T> observable

J'ai un service avec un sujet:

@Injectable() export class UserService() {
    private currentUserSubject = new BehaviorSubject<User>(null);
    public currentUser = this.currentUserSubject.asObservable().distinctUntilChanged(); 

    ... // emitting new User    
}

Avoir un composant dans lequel j'injecte ce service et m'abonne aux mises à jour:

@Component() export class UserComponent {
    constructor(private userService: UserService) {
        this.userService.currentUser
            .subscribe((user) => {
                // I want to see not null value here
            })
    }
}

Je veux appliquer quelque chose à Observable<User> pour filtrer toutes les valeurs nulles et entrer dans l'abonnement uniquement lorsque User est réellement chargé.

10
fasth

Ajoutez un opérateur de filtre à votre chaîne observable. Vous pouvez filtrer les valeurs nulles explicitement ou simplement vérifier que votre utilisateur est véridique - vous devrez effectuer cet appel en fonction de vos besoins.

Filtrage des utilisateurs nuls uniquement:

public currentUser = this.currentUserSubject
                         .asObservable()
                         .filter(user => user !== null)
                         .distinctUntilChanged(); 
20
snorkpete

Une autre façon de vérifier la valeur existe

public currentUser = this.currentUserSubject
                         .asObservable()
                         .filter(Boolean)
                         .distinctUntilChanged(); 
15
ackuser

avec rxjs@6 et TypeScript, la méthode recommandée (lisible/maintenable) consiste à définir la protection de type suivante:

export function isNonNull<T>(value: T): value is NonNullable<T> {
  return value != null;
}

et augmentez un sujet avec pipe et filter:

subject.pipe(filter(isNonNull))
1
Amit Portnoy