【问题标题】:Do I have to explicitly define an observable as "finite"?我是否必须将可观察对象明确定义为“有限”?
【发布时间】:2021-04-15 15:50:39
【问题描述】:

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

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

【问题讨论】:

    标签: angular rxjs rxjs-observables


    【解决方案1】:

    是和否。

    有些 observables 在构造上是有限的。例如,这包括所有 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");
    });
    

    在记录数组的内容后,这个 observable 将完成。按施工。

    这是一个未完成的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" 永远不会被记录。始终,有限 observable 将显式调用其观察者的completeerror 回调。没有任何 observables 可以通过任何类型的库魔法完成。

    话虽如此,许多运营商都会为您完成这项工作。 RxJS#from 构造 Promises 和 Arrays 是有限的,但您可以使用(例如)taketakeWhile 等使 any 源有限。


    但真的:没有

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

    【讨论】:

    • 不错的答案!荣誉。
    • 非常感谢您深思熟虑的回复。我将此标记为已接受的答案。非常有启发性!
    猜你喜欢
    • 2017-05-12
    • 2017-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多