3

如果我有一个在其生命周期内发出单个值的主题的课程:

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

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

然后在另一个班级:

this.instanceOfMyClass.myEmitter.subscribe();

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

4

1 回答 1

3

当您调用complete该主题时,任何订阅者都将被自动取消订阅。

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

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;
}

您会看到主题调用complete了它的每个观察者。Observable Contract声明:

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

于 2017-08-19T02:29:24.680 回答