如何通过单个订阅对可观测对象的首次发射进行特殊处理

时间:2019-06-06 14:50:09

标签: 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.anotherEltArrayOnlyChangedOnce = eltArray
);

出于好奇,而且为了限制我的订阅数量(必须取消订阅),我想知道如何仅用一个Subscription就可以达到相同的结果。

因此,我想在首次发射anotherEltArrayOnlyChangedOnce时初始化this.service.obs$,并在eltArray每次发射时设置this.service.obs$

2 个答案:

答案 0 :(得分:2)

您可以执行以下操作-

anotherEltArrayOnlyChangedOnce = null;

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

      this.eltArray = eltArray
    }
   )

答案 1 :(得分:2)

您可以使用扫描运算符添加一个计数器。

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