我是否必须将可观察对象显式定义为 "finite"?

Do I have to explicitly define an observable as "finite"?

有几种资源 (like this one) 定义了什么是“有限”可观察对象(最终停止发出值的可观察对象)。据我所读,人们普遍认为不需要取消订阅有限可观察量。

是否需要做任何事情才能将 Observable 明确定义为“有限”? This article 展示了 Angular HttpClient 在其 Observer 上调用 complete() 是如何迫使其观察者取消订阅的。这就是它“有限”的原因吗?或者一个 observable 是否可以在没有显式调用 complete() 的情况下就其性质而言是有限的?如果是这样,不取消订阅一个本质上是有限的可观察对象是否安全?

是也不是

一些可观察量在结构上是有限的。例如,这包括所有 Promise。它还包括

const someArray = [/* array contents */]
from(someArray).subscribe({
  next: console.log, // Log emissions
  error: _ => {},    // We could ignore errorsby omitting this line, but hey
  complete: () => console.log("This observable completed");
});

记录数组内容后,此可观察对象将完成。通过建设。

这里是 from 的简化版本,未完成

function endlessFrom(array) {
  return new Observable(observer => {
    array.forEach(observer.next.bind(observer))
    // observer.complete(); <- Oh no! ;)
    return {
      unsubscribe: () => {} // Do nothing
    }
  })
}

const someArray = [/* array contents */]
endlessFrom(someArray).subscribe({
  next: console.log, // Log emissions
  error: _ => {},    // We could ignore errorsby omitting this line, but hey
  complete: () => console.log("This observable completed");
});

如果您 运行 这样做,您会看到 "This observable completed" 从未被记录。 finite observable 总是会调用其观察者的 completeerror 回调 显式 。没有可通过任何类型的任何库魔术完成的可观察对象。

话虽这么说,但许多运营商会为您完成这项工作。 RxJS#from 构造 Promise 和数组是有限的,但是您可以使用(例如)taketakeWhile 等[=] 使 any 源有限21=]


但真的:没有

没有 运行 时间标志或 属性 可以使可观察到有限。唯一的方法是让 Observable 发出 errorcomplete。这是有道理的。即使您可以将 observable 标记为有限的,观察者可以使用什么机制来了解 observable 何时已履行其完成义务?