RxJS Observable 中的循环在调用完成或错误后不会停止

Loops in RxJS Observable don't stop after calling complete or error

当调用 observer.complete()observer.error() 时,观察者停止发送数据并被视为完成。但是,如果在观察者中有一个 for 循环,即使在调用 observer.complete() 之后,循环也会继续 运行ning。有人可以向我解释这种行为吗?我希望循环会被缩短。当前的行为意味着间隔或 while 循环将永远 运行 在 Observable 中,除非我取消订阅代码。

在下面的代码片段中,我添加了一个 console.log 以查看是否会在 observer.complete() 之后调用日志。

    const testObservable = new Observable( observer => {
    for (let count = 0; count < 11; count++){
      observer.next(count);
      if (count > 5) {
        observer.complete()
        console.log("test")
      }
      if (count > 7) {
        observer.error(Error("This is an error"))
      }
    }}
  );

let firstObservable = testObservable.subscribe(
    next => {console.log(next)},
    error => { alert(error.message)},
    () => {console.log("complete")}
  )

创建函数有责任正确销毁资源。在您的情况下, observer.complete().

之后可能只有 return 语句

但一般来说,如果需要,创建函数应该 return 拆解函数 (TeardownLogic),在可观察对象完成时调用。

new Observable( observer => {
  // observable logic, e.g. ajax request
  return () => {
    // teardown function, e.g. cancel ajax request
  };
});

Observable 会在 observable 完成后忽略将来对 next(...)complete()error(...) 的调用。这意味着 complete()error(...) 函数在内部被调用或者 observable 被外部取消订阅。

new Observable( observer => {
  observer.next('a');
  observer.complete();
  // next calls will be ignored
  observer.next('b');
});
const observable = new Observable( observer => {
  setTimeout(
    () => observer.next('a'), // this will be ignored due to unsubscribe
    10
  );
});
const subscription = observable.subscribe(...);
subscription.unsubscribe();