typescript 如何在rxjs中合并父观察项和子观察项

vjhs03f7  于 2023-01-21  发布在  TypeScript
关注(0)|答案(3)|浏览(142)

我已经创建了一个带有子观察项的父观察项。当子观察项完成时,父观察项也完成了。
有没有一种更好的方法可以做到这一点,而不必使用subscripe()两次。
代码:

const parentObservable = new Observable((observer) => {
  
  if (condition) {
     observer.complete();
     return;
  }

  this.childObservable().subscribe(() => observer.complete());
});

parentObservable.subscribe();
    • EDIT:**我们希望能够在满足条件时不订阅子项
vjrehmav

vjrehmav1#

合并操作符允许您将多个观察对象合并为单个观察对象。您可以使用此操作符合并父观察对象和子观察对象。

const parentObservable = new Observable((observer) => {
  // random sync code
});

const childObservable = this.childObservable();

merge(parentObservable, childObservable).subscribe();

如果希望在子观察项完成时完成父观察项,可以改用concat运算符。concat运算符将从第一个观察项发出值,然后在第一个观察项完成后从第二个观察项发出值。

import { concat } from 'rxjs';

const combinedObservable = concat(parentObservable, childObservable);
combinedObservable.subscribe();

这将在子观察项完成时完成父观察项。

merge操作符将所有可观察值合并到一个流中,并在它们到来时发出值。
concat运算符连接可观察对象,并仅在第一个可观察对象完成后才发出值。

qco9c6ql

qco9c6ql2#

根据你的描述
当子观察项完成时,它将完成父观察项。
我相信您可以使用takeUntil

const parentObservable = new Observable((observer) => { ... });

parentObservable.pipe(takeUntil(childObservable)).subscribe();

每当childObservable发出一个值时,管道将完成,并且parentObservable的拆卸逻辑(如果有)将运行。

dgtucam1

dgtucam13#

你例子中的new Observable构造函数从来不输出任何值,所以它将是一个非常无用的可观察对象,你可以直接删除它,不用担心完成一个无用的可观察对象。
考虑到这一点,您的示例代码可以如下重写:

const parentObservable = defer(() => {
  if(condition){
    return EMPTY;
  }
  return this.childObservable();
});
parentObservable.subscribe();

这是对childObservable的有条件订阅。
这可以进一步简化为:

const parentObservable = defer(
  () => condition? EMPTY: this.childObservable()
);
parentObservable.subscribe();

或:

defer(() => condition? EMPTY: this.childObservable())
  .subscribe();

相关问题