web-dev-qa-db-ja.com

Observable <T>からすべての「null」値をフィルタリングします

私は主題を持つサービスを持っています:

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

    ... // emitting new User    
}

このサービスを注入し、更新をサブスクライブするコンポーネントを用意します。

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

Observable<User>に何かを適用してすべてのnull値をフィルタリングし、Userが実際にロードされたときにのみサブスクライブしたい.

10
fasth

監視可能なチェーンにフィルター演算子を追加します。 nullを明示的にフィルタリングすることも、ユーザーが真実であることを確認することもできます。必要に応じてその呼び出しを行う必要があります。

nullユーザーのみを除外:

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

値を確認する別の方法が存在します

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

rxjs@6およびTypeScriptが推奨される(読み取り可能/保守可能な)方法は、次のタイプガードを定義することです。

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

件名をpipeおよびfilterで拡張します。

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