【问题标题】:RxJS Does Observable empty the data array after onCompleted is called?RxJS 调用 onCompleted 后 Observable 是否清空数据数组?
【发布时间】:2016-08-15 08:30:54
【问题描述】:

我在 RxJS 上苦苦挣扎。关于 Observable 的一些问题

  1. 调用 onCompleted 后 Observable 是否清空数据数组?
  2. 当我将两个 subscribe() 方法链接在一起时,我收到错误“订阅类型中不存在订阅”。这是为什么?

    someObs.map(...).subscribe(...).subscribe(...)

  3. 有没有办法在不订阅的情况下检查可观察的数据数组计数?

  4. 如果 Observable 在发出数据项后将其清除,是否有办法将新数据项重新填充到同一个 observable 实例中而不创建新实例?如果是,如何?

【问题讨论】:

  • 不确定其他的,但是2不起作用,因为#subscribe()的返回类型是Subscription,它没有一个名为#subscribe()的方法。为了让它工作,#subscribe() 必须再次返回 Observable,这没有任何意义。您应该将 .subscribe() 调用移动到它们自己的行,而不是链接它们。哦,对于#4,你可以使用Subject

标签: reactive-programming rxjs


【解决方案1】:
  1. 没有。 RxJS 是函数式编程的近亲,这意味着突变通常是一个很大的禁忌。流式数据的全部意义在于避免状态突变,这在许多方面是当今应用程序中许多问题的根源。

所有 Observable 所做的只是包装各种数据源类型,以便它们通过公共接口发出事件。因此Rx.Observable.fromArrayRx.Observable.fromPromise 都产生具有相同语义的 Observable,唯一的区别是事件的数量和这些事件的产生时间。

  1. Observables 是懒惰的,所有花哨的方法链接在 Observable 最终被订阅之前都不会做任何事情。这样subscribe 真的就像在说“执行”或“开始”,它将允许事件开始在 Observable 中移动。

  2. 不确定“Observable 数据数组”是什么意思,请参阅第 1 点。如果将数组传递给 Observable,那么您应该能够检查 that 的大小p>

  3. 它没有,但是从某种意义上说,您可以通过简单地重新订阅一个基于数组的 Observable 来“重新填充”它,这将开始再次发送事件的过程。正如 dvlsg 所提到的,您还可以使用 Subject 将事件显式推送到观察者,但在 99% 的情况下,可以并且应该避免使用它,因为它被用作避免必须真正成为的拐杖 反应式

var source = Rx.Observable.fromArray([1, 2, 3, 4]);

//First subscription, prints all of the events from array
source.subscribe(x => console.log(x));

//Second subscription, prints all the events *again* because
//this is a new subscription occurrence
source.subscribe(y => console.log(y));

【讨论】:

  • paulpdaniels,感谢您的详细解释清除了我脑海中的很多泥巴:)
  • 我必须对第 4 点提出至少一点不同意见。我同意,当您可以避免使用 Subject 时,您应该这样做,但很多时候您会想要订阅一组长期运行的更改,您需要手动推送更改来自rxjs 不直接支持的来源。 Subject 可能与 nodejs 中的 EventEmitter 更密切相关。我想您可能会争辩说,在这些情况下您应该只使用 EventEmitter 并订阅 that
  • 这里有更多来自 rxjs 文档的reading
  • 从概念上讲,您是对的,Subjects 在语义上与EventEmitters 相似,当然可以 使用它们,但是,每当有人说“手动推送更改”时通常意味着您实际上还没有到达事件的源头。一旦你这样做了,10 次中有 9 次可以用一种工厂方法解决。 Subjects 主要在内部用于多重施法行为,它可以被严格限制并且它的状态不会到处流血。
猜你喜欢
  • 1970-01-01
  • 2017-02-15
  • 2017-06-15
  • 2018-08-30
  • 2019-10-11
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 2017-07-30
相关资源
最近更新 更多