过滤所有&#39; null&#39;来自Observable <t>的值

时间:2017-03-27 10:06:12

标签: javascript angular typescript rxjs observable

我有一个主题服务:

@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>以过滤所有空值,并仅在实际加载User时进入订阅。

5 个答案:

答案 0 :(得分:17)

向您的可观察链添加过滤器运算符。您可以明确过滤空值或只检查您的用户是否真实 - 您必须根据需要进行调用。

仅过滤掉空用户:

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

答案 1 :(得分:10)

Anoter检查值的方法存在

{{1}}

答案 2 :(得分:7)

使用rxjs@6和打字稿,建议的(可读/可维护)方法是定义以下类型防护:

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

并使用pipefilter扩充主题:

subject.pipe(filter(isNonNull))

答案 3 :(得分:3)

这很简单:

filter(user => !!user),

如果用户评估为false,则不会通过过滤器。

因此将过滤these falsy values (link to Falsy on MDN)

答案 4 :(得分:0)

rxjs@6 的另一个选择是创建另一个 skipWhile 的包装运算符。

// rxjs.utils.js
export const skipNull = () => <T>(source: Observable <T>): Observable<T> => source.pipe(skipWhile(value => value === null));

用法:

this.observable.pipe(skipNull()).subscribe(...)
相关问题