Rxjs-检查Observable是否为空,而无需订阅

Jul*_*ius 3 observable rxjs angular

我想知道是否有可能检查可观察值是否收到任何值。而且我想要这个而不订阅它,因为我太懒了以至于无法覆盖当前代码。问题是我在父组件中创建了可观察对象,然后将其传递给子组件。而且我只需要一件小事,因此订阅该书似乎是不必要的...

父组件:

  adverts$: Observable<advert[]>;

  ngOnInit() {
    this.adverts$ = this.advertService.advertsPerUser();
Run Code Online (Sandbox Code Playgroud)

服务:

  advertsPerUser() {
    return this.advertsKeysPerUser()
      .map(adKeys => adKeys.map(adKey => this.afDb.object('adverts/' + adKey.$key )))
        .flatMap(val => Observable.combineLatest(val) );
  }
Run Code Online (Sandbox Code Playgroud)

所以我的目标是在parent-component.html中执行以下操作:

<div *ngIf="adverts$"> 
Run Code Online (Sandbox Code Playgroud)

fre*_*red 9

您可以尝试使用 defaultIfEmpty 运算符(请参阅说明)。假设您的 adsPerUser 返回一个数字,您可以这样做:

this.adverts$ = this.advertService.advertsPerUser().map(count => count > 0).defaultIfEmpty(false);
Run Code Online (Sandbox Code Playgroud)

在 HTML 中:

<div *ngIf="adverts$ | async">
Run Code Online (Sandbox Code Playgroud)

或使用 rxjs 版本 6:

this.adverts$ = this.advertService.advertsPerUser().pipe(
    map(count => count > 0),
    defaultIfEmpty(false)
);
Run Code Online (Sandbox Code Playgroud)

  • 提示:“defaultIfEmpty”仅在可观察对象完成且没有任何排放的情况下才有效。它并不意味着“如果为 null 或未定义则为默认值”。所以要小心,否则会非常混乱! (6认同)

小智 6

简而言之,没有。

默认情况下,Observable是单播,其行为类似于功能,因此一旦实际订阅,便向观察者发出值。重要的是它类似于功能,订阅是启动那些可观察对象的实际尝试。如果您想到典型的函数返回一个值(或不返回),则直到函数实际执行并返回其结果时,您才能知道。同样适用于Observable,在订阅之前,您无法拥有源的值。


Dei*_*sch 5

我遇到了类似的问题,我想检查我的响应(自定义类型的数组)是否为空。这是我的解决方案

<div *ngIf="(response$ | async).length == 0">
    <p>no results</p>
</div>
Run Code Online (Sandbox Code Playgroud)