Rxjs - 检查Observable是否为空,没有订阅它

时间:2017-09-19 17:56:07

标签: angular rxjs observable

我想知道是否可以检查observable是否收到任何值。我想要这个没有订阅它,因为我懒得覆盖我当前的代码。问题是我在父组件中创建了observable,然后将其传递给子组件。而且我只需要一件小东西,所以订阅它,似乎没必要......

母体组分:

  adverts$: Observable<advert[]>;

  ngOnInit() {
    this.adverts$ = this.advertService.advertsPerUser();

服务:

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

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

<div *ngIf="adverts$"> 

5 个答案:

答案 0 :(得分:5)

简而言之,没有。

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

答案 1 :(得分:1)

您可以尝试使用defaultIfEmpty运算符(请参见description)。假设您的advertsPerUser返回一个数字,您可以执行以下操作:

this.adverts$ = this.advertService.advertsPerUser().map(count => count > 0).defaultIfEmpty(false);

在html中:

<div *ngIf="adverts$ | async">

或使用rxjs版本6:

this.adverts$ = this.advertService.advertsPerUser().pipe(
  map(count => count > 0),
  defaultIfEmpty(false)
);

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

如果可观察的源为空,则可以使用defaultIfEmpty运算符定义一些默认值。

答案 4 :(得分:0)

使用@Deitsch 我刚刚做了一个更改以避免打字稿错误:

<div *ngIf="(response$ | async)?.length == 0">
    <p>no results</p>
</div>

我在 ? 属性前添加了符号:lenght

相关问题