【问题标题】:RxJS & Angular 6 - observables, subjects and basic get and add operations on arraysRxJS 和 Angular 6 - 可观察对象、主题和基本的获取和添加数组操作
【发布时间】:2018-08-10 11:44:06
【问题描述】:

我正在努力将我的头包裹在可观察对象/观察者/主题和角度上。我浏览了许多涵盖可观察基础知识的教程,并且基本订阅方案很有意义。然而,这些教程似乎没有涵盖 添加 到可观察的集合。他们中的大多数似乎也专注于使用 HttpClient,而我试图在不依赖 Web 服务的情况下模拟一些数据 - 只是用于测试的基本内存中对象数组。

我创建了一个简单的应用程序来展示我的困惑。

组件 1 和服务 1 展示了一种获取数字集合和添加新数字的基本不可观察方式。组件 2 和服务 2 展示了一种可观察到的获取数据并由于订阅而自动获取更新的方式。我正在使用主题来做到这一点。

https://github.com/rpasechnikov/observable-test-app

有人能指出我是否走在正确的道路上,还是我完全误解了可观察到的模式?我需要在这里使用主题还是应该能够坚持使用 Observables?如果是这样 - 我如何从中提出 next() 通知?最重要的是,有没有人知道为什么第一个 this.subject.next() 不会触发更新,而进一步的调用会触发更新?

谢谢大家!!

【问题讨论】:

  • this.subject.next() 不会触发事件,因为它在订阅之前运行并且主题不会返回第一个值。考虑使用BehaviorSubject 来解决这个问题。关于添加,您将添加到数组中并推送另一个数组。如果您想在订阅中看到更改,请考虑推送更改。
  • 当您希望部分代码对事件做出反应时,通常会使用 observable。查看您的代码,您应该有一个服务、一个消息/事件发送器和一个消息/事件接收器。我认识服务和发送者,但不认识接收者。我发现以下关于如何使用主题非常清楚:jasonwatmore.com/post/2018/06/25/…
  • 非常感谢您的建议!我已经使用 BehaviorSubject 更新了示例代码,现在一切似乎都运行良好。关于 next() 现在不触发是有道理的。也感谢文章链接 - 现在阅读:) 我可以问一下我什么时候会使用普通的 observable 吗?它总是让我感到困惑,示例如何从 HttpClient GET 创建 observable。如果 HttpClient GET 不再被调用,任何新项目将如何进入 Observable?这是否只是表明这是一个起点,我们可以在计时器上轮询 HttpClient GET 并通知客户端任何新值?

标签: angular rxjs observable subject-observer


【解决方案1】:

使用 Observables 的概念很容易被误解,因为有很多东西要同时查看!!!

但是您不必惊慌,因为它们并没有您想象的那么糟糕。

您正在使用一种特殊类型的 Observable,它既是 Observer 又是 Observable 以及其他诸如 multicasting 之类的东西。

Observer:当你想通过next更新可观察流时,你使用我

Observable:当你想通过subscribe从可观察流中获取值时,你可以使用我

Ben Lesh gave a talk on Subjects

在您的情况下 (Service 2 on your github),您使用的是 Subject。这意味着如果我在通过next 更新我的流之前没有观察者(有人订阅了我),该人将无法获得价值。

您可以尝试使用BehaviorSubject。主要区别是什么

  1. 我必须有一个初始值
  2. 每当有人订阅我时,无论是在我更新之前还是之后,他们总是会获得最新的值。

试一试!

希望对你有帮助

【讨论】:

  • 感谢您简洁而详细的回答!只是为了仔细检查-在我的例子中,组件 2 是服务 2 中的 Observable 的观察者,对吗?所以在这种情况下,Service 2 Subject 有 2 个观察者——它自己和组件 2,对吗?
  • 没问题我很高兴它有帮助!对于您的问题,我只能看到 Component 2 中的 1 个订阅,这意味着只有一个人在观察。您的服务有观察者,但您的组件正在观察。就这样吧。当您去看电影时,您正在观看电影(组件),而电影院有电影并在您观看时更新它(服务)
  • 希望你能理解!我不好的比喻:)
猜你喜欢
  • 1970-01-01
  • 2019-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-09
  • 2021-11-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多