我有一个主题服务:
@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
时进入订阅。
答案 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;
}
并使用pipe
和filter
扩充主题:
subject.pipe(filter(isNonNull))
答案 3 :(得分:3)
filter(user => !!user),
如果用户评估为false,则不会通过过滤器。
答案 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(...)