Rxjs 如何对单个订阅的可观测数据的首次发射进行特殊处理

Rxjs 如何对单个订阅的可观测数据的首次发射进行特殊处理,rxjs,observable,Rxjs,Observable,我有以下代码: this.obs$ = this.service.obs$; this.obsSubscription = this.obs$.subscribe( (eltArray: Elt[]) => this.eltArray = eltArray ); this.anotherObsSubscription = this.obs$.pipe(take(1)).subscribe( (eltArray: Elt[]) => this.anotherElt

我有以下代码:

this.obs$ = this.service.obs$;

this.obsSubscription = this.obs$.subscribe(
    (eltArray: Elt[]) => this.eltArray = eltArray
);

this.anotherObsSubscription =  this.obs$.pipe(take(1)).subscribe(
    (eltArray: Elt[]) => this.anotherEltArrayOnlyChangedOnce = eltArray
);
出于好奇,但也为了限制我必须取消订阅的订阅数量,我想知道如何仅使用一次订阅就能达到相同的效果


所以我想在这个.service.obs$的第一次发射上初始化一个LTARRAYONLYCHANGEDONCE,并在这个.service.obs$的每次发射上设置ELTRARY

您可以执行以下操作-

anotherEltArrayOnlyChangedOnce = null;

this.obs$.subscribe((eltArray: Elt[]) => {
      if(this.anotherEltArrayOnlyChangedOnce === null) {
        this.anotherEltArrayOnlyChangedOnce = eltArray
      }

      this.eltArray = eltArray
    }
   )

您可以执行以下操作-

anotherEltArrayOnlyChangedOnce = null;

this.obs$.subscribe((eltArray: Elt[]) => {
      if(this.anotherEltArrayOnlyChangedOnce === null) {
        this.anotherEltArrayOnlyChangedOnce = eltArray
      }

      this.eltArray = eltArray
    }
   )

您可以使用扫描操作员添加计数器

this.obs$.pipe(
    scan((acc, value) => [acc[0]++, value], [0])
).subscribe(([count, eltArray]: [number, Elt[]]) => {
    if(count === 1) {
       this.anotherEltArrayOnlyChangedOnce = eltArray;
    }
    this.eltArray = eltArray;
});

您可以使用扫描操作员添加计数器

this.obs$.pipe(
    scan((acc, value) => [acc[0]++, value], [0])
).subscribe(([count, eltArray]: [number, Elt[]]) => {
    if(count === 1) {
       this.anotherEltArrayOnlyChangedOnce = eltArray;
    }
    this.eltArray = eltArray;
});

我知道take1或first operator的存在,但希望找到一种方法将它们与我的订阅结合起来。我也知道,我可以在我的组件中使用一个布尔值来指示我的列表是否已初始化,但这并不是很优雅,是吗?取决于你的可观测值,这个.obs$.pipetake1并不保证你得到可观测值的第一次发射,还要注意,发送给每个订阅者的第一项不一定相等。我不确定这两件事对你的工作是否重要,但值得考虑。对我来说,单一订阅+布尔解决方案听起来很不错。我知道take1或first运算符的存在,但想找到一种方法将它们与我的订阅结合起来。我也知道,我可以在我的组件中使用一个布尔值来指示我的列表是否已初始化,但这并不是很优雅,是吗?取决于你的可观测值,这个.obs$.pipetake1并不保证你得到可观测值的第一次发射,还要注意,发送给每个订阅者的第一项不一定相等。我不确定这两件事对你的工作是否重要,但值得考虑。对我来说,单一订阅+布尔解决方案听起来很不错。它非常适合我的需要:简单,非常优雅,并且具有预期的行为。因此,我对答案投了赞成票。然而,我不会将此标记为可接受的答案,因为它并不确切地回答如何对单个订阅的可观测数据的首次发射进行特殊处理,而是如何在单个订阅的标准处理之外对可观测数据的首次发射进行初始化。不过,非常感谢。它非常适合我在这里的需要:简单,相当优雅,并且具有预期的行为。因此,我对答案投了赞成票。然而,我不会将此标记为可接受的答案,因为它并不确切地回答如何对单个订阅的可观测数据的首次发射进行特殊处理,而是如何在单个订阅的标准处理之外对可观测数据的首次发射进行初始化。不过,非常感谢。