主题完成后主题是否安全取消订阅?

时间:2017-08-18 19:41:44

标签: rxjs subject subject-observer

如果我的课程主题在其生命中发出单一值:

export class MyClass {
  myEmitter$: Subject<void> = new Subject();

  someMethod(){
    this.myEmitter$.next();
    this.myEmitter$.complete();
  }
}

然后在另一个班级:

this.instanceOfMyClass.myEmitter.subscribe();

我应该取消订阅instanceOfMyClass.myEmitter$,因为主题在发出后完成了吗?

1 个答案:

答案 0 :(得分:3)

当您在主题上致电complete时,任何订阅者都将自动取消订阅。

如果您查看主题complete method的来源:

complete() {
  if (this.closed) {
    throw new ObjectUnsubscribedError();
  }
  this.isStopped = true;
  const { observers } = this;
  const len = observers.length;
  const copy = observers.slice();
  for (let i = 0; i < len; i++) {
    copy[i].complete();
  }
  this.observers.length = 0;
}

您会看到主题在每个观察者身上调用completeObservable Contract表示:

  

当Observable向其观察者发出[error]或[complete]通知时,这将结束订阅。观察者不需要以这种方式发出[取消订阅]通知来结束由Observable结束的订阅。