- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我正在尝试破译以下函数:
Subscription getCar(id, Observer<Car> observer) {
return getCarDetails(id, new Observer<CarDetails> {
@Override
onNext(CarDetails details) {
observer.onNext(details.getCar());
} });
}
我从 http://blog.danlew.net/2014/09/15/grokking-rxjava-part-1/ 获得了 rxjava 的一个很好的介绍但它只是顺便提到了 Observer,说您将在大部分时间使用订阅者来消费从 Observable 发出的项目。
谁能给我解释一下
Javadoc让它看起来就像一个订阅者。订阅者的 javadoc 说它实现了观察者和订阅。我很困惑。
最佳答案
已编辑:带有@Alrid 的评论
tl;dr
public abstract class Subscriber<T> implements Observer<T>, Subscription
所以 Subscriber是 Observer 的实现,在订阅上有额外的语义(更多的是关于取消订阅)。您问题中的代码只是表明它通过了 Observer
接口(interface),而不是实现(通常的编程实践)。
此代码还返回一个 Subscription
,这可能是因为此代码的作者认为客户端应该只能访问 Subscription
方法,而不能访问生成的元素由可观察的。这可能是程序员的错误。
长篇大论
您真的应该阅读本网站(或书籍)的内容:http://www.introtorx.com它是关于 Rx.Net,但概念是相同的,它们是由 Erik Meijer 创建的,RxJava 实现者遵循 them (如果适用于 Java 语言)。
这个页面会让你感兴趣(这是第二章):KeyTypes
您将在此处阅读第一段:
There are two key types to understand when working with Rx, and a subset of auxiliary types that will help you to learn Rx more effectively. The IObserver and IObservable form the fundamental building blocks for Rx, while implementations of ISubject reduce the learning curve for developers new to Rx.
...
Essentially Rx is built upon the foundations of the Observer pattern. .NET already exposes some other ways to implement the Observer pattern such as multicast delegates or events (which are usually multicast delegates).
即使类型/API 有点不同,你也会从这本书中学到很多东西,可能比一些博客学到的要多。
这本书没有说什么(...因为它在 RxJava 实现中)
此时,RxJava 的主要开发人员引入了一个细微的变化(参见 PR #792),可以区分两种类型的合约:
观察者
订阅
此更改允许更好地表达/拆分 RxJava 库的实现类的这些问题。
但是,作为库用户,使用 RxJava 库的实际实现应该就足够了。
实现订阅者需要更多的知识、工作和关心,实际上订阅语义非常重要,具体取决于可观察源的类型(热还是冷?创建成本高吗?)
在上述情况下暴露 Subscriber
而不是 Observer
在大多数情况下不会干扰代码,但这不是它的预期用途,除非那些不- 需要订阅语义。但最终实现 Subscriber
,可能会陷入一些陷阱,例如:
关于java - 观察者和订阅者有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27664221/
AngularFire2 文档演示了以下将观察者绑定(bind)到您的 Firebase 可观察对象的模式: this.item = af.database.object('/item'); {{ (
我正在使用观察者模式和 BlockingQueue 添加一些实例。现在在另一种方法中,我正在使用队列,但似乎 take() 一直在等待,即使我这样做: /** {@inheritDoc} */ @Ov
我遇到问题 - 创建具有不同属性的订单。在我的工作案例中,用户有大约 10 个不同的属性,每个属性有 3-4 个变体。 我正在使用 Angular js,并编写了两个函数: 二传手 $scope
我尝试将额外的产品添加到购物车。我为此创建了一个观察者。 getEvent()->getControllerAction()->getFullActionName() == 'checkout_car
我尝试将额外的产品添加到购物车。我为此创建了一个观察者。 getEvent()->getControllerAction()->getFullActionName() == 'checkout_car
假设我想创建一组基于类型的观察者。也就是说,当他们收到事件通知时,他们会被告知其中一个参数的类型,然后根据是否可以对该类型进行操作来决定是否采取行动。 有没有简单的方法可以做到这一点?我认为这对于泛型
快速提问。 当 setChanged() 和 notifyObservers() 被调用并且 Observer.update() 运行时,它是否在一个新的 Thread,还是在同一个Thread中?
我必须为可观察对象和观察者创建代码。正如您所知,每个观察者都有自己的“更新”方法。 在我的可观察代码中,我使用了“notifyObservers”方法。它的参数是一个字符串数组,其中包含有关我的项目的
是否有一种设计模式可以形成“复合”观察者/可观察对象? 我的意思是我有一个可观察的 A 通知它的听众一些变化。 每个监听器也是一个可观察对象,并通知自己的监听器(在它执行的某些操作中,哪个操作是由第一
我对以下代码为何不起作用感到有点困惑: MutableLiveData mutableTest = new MutableLiveData<>(); MediatorLiveData mediator
场景:我有两个名为 FirstFragment 的 fragment 和 UnitFragment .我来自 FirstFragment至UnitFragment选择一个单位返回FirstFragme
我想了解如何 平面 map 作品。我知道这是处理 Observable> 的一种方式。 无论如何,我正在测试它的行为并陷入困境: let plusDom = document.querySelecto
我有 public class mammal implements Imammle { public String getName() { return "Mammal";
如果我使用 KVO 来观察我的播放器项目,如下所示: AVPlayerItem *playerItem = [AVPlayerItem playerItemWithURL:url];
我想在正在使用的变量上使用观察者,这是我的代码: const get = Ember.get; uploader:Ember.inject.service('uploader'), progressC
我一直在使用Laravel Observers每当我的模型被删除/更新/保存时处理我的应用程序逻辑。我注意到在某些情况下这些观察者不会被触发。例如,如果我使用 Model::where(active,
我有一个工作人员服务来发送一些简单的通知。但现在,我想在发送之前检查数据库中的一些数据。 但是,我不能在工作线程中使用观察者,它必须在主线程中。我有一个错误类型 java.lang.IllegalSt
我有 2 个字段:美元和日元。当我更改美元字段时,我想在日元字段中显示转换后的数字,反之亦然。 我的问题是这样的: 如果我有 2 个带有观察者的字段,例如: addTextChangedListene
在 View Controller 中,我创建了一个 subview 数组,可以随时从父 View 中删除,因此它们的生命周期比 View Controller 的生命周期短。 创建它们时,我几乎这样
如何在另一个线程上运行 RxJava,因为主线程上的工作太多。 我在一个方法内运行观察者,下面是代码 fragment : public void updatePie() { RxJavaPlugin
我是一名优秀的程序员,十分优秀!