【问题标题】:understanding observers and subscibers angular2了解观察者和订阅者 angular2
【发布时间】:2016-12-28 16:50:56
【问题描述】:

长期潜伏者 - 第一次海报。 这是很多理论,所以请耐心等待。

我正在对可观察者、观察者和订阅者(​​rxjs 和 angular2)的概念进行心理建模,并希望确保我走在正确的轨道上。

我目前将 observables 理解为“可以观察和采取行动的事件流”。数组和请求可以被转换为 observable,以便观察者可以订阅它们,并且在触发事件时可以对该事件或 observable 中的数据采取行动。

我看到订阅者是一种观察者,它可以通过 3 个可能的处理程序来观察可观察对象:onNext、onComplete 和 onError。

我知道,只要订阅者可以访问要订阅的 observable,它们就可以在不同的类中。

如果这是准确的描述,请告诉我。

如果这是真的,我很好奇如何使数组可观察,如下所示: 当新项目添加到数组中时,我如何订阅该事件并对其采取行动?

我尝试通过创建一个数组、用鼠标事件填充它并尝试将此数组转换为 Observable 来解决这个问题。

这失败了,但我能够创建一个可观察的主题,使用 next() 推送新项目并使用订阅者订阅这些下一个事件(我不知道它是什么类型,所以我只是让它不输入因为我无法让编译器接受我输入的任何内容)。

我的问题是:

1) 我对 observable & observer/subscriber 的上述理解是否正确?

2) 我可以创建一个标准数组,使其可观察并监听“添加”或“修改”事件吗?

3) 我上面提到的订阅者的类型是什么?

this.mouseLocationSubscriber = this.mLocs$.subscribe(
        X => this.handleNext(X),
        err => this.handleSubscriberError(err),
        () => console.log('subscriber recd complete')
);

请:

  • 如果这个帖子发错地方了,请帮我把它放到正确的位置

  • 如果这篇文章的格式不正确,请帮助我了解如何设置格式以便最好地找到答案

  • 如果这篇文章是一些类似的丢失代码理论家的欺骗,请帮我找到回复

  • 如果还有什么我应该被围攻的,我已经为你准备了一个干草叉:----E

【问题讨论】:

标签: angular rxjs observable observers subscriber


【解决方案1】:

1) 我对 observable & observer/subscriber 的上述理解是否正确?

您走在正确的轨道上,我认为该定义没有任何错误。也许我要改变的是,我会将观察者/订阅者合并为一个实体,因为它们完全相同。

另外,请记住,Observables 采用函数式编程方法:当您创建流时,在观察者对其调用 .subscribe() 之前,不会执行任何操作。

人们经常感到困惑的另一件事是onError 的使用。当流产生onError 时,意味着发生了不可恢复的崩溃:流被关闭并且onNext 不会再次被调用。当人们想要获得某种软错误时,他们所做的就是调整 Observable 类型以包含它,例如 isSuccesfull:booleanerrors:Error[]

2) 我可以创建一个标准数组,使其可观察并监听“添加”或“修改”事件吗?

不... Observables 不能变魔术。从Rx.Observable 你可以得到一些辅助方法来将数组转换为 Observable 序列,但它们不是 observable 数组。想想看,你可以观察到你可以用Rx.Observable.create 做的任何事情,例如,Rx.Observable.fromArray 的可能实现可能是:

function observableFromArray(array){
    return Rx.Observable.create((observer) => {
        array.forEach((elm) => {
            observer.onNext(elm);
        });
        observer.onCompleted();
    });
}

但是正如你所看到的,当一个项目被推入数组时,没有办法通知观察者。

Proxies 可以用来做这样的事情,它允许你拦截在对象/数组中完成的操作......这有点前卫,所以不要在 IE 中过度支持。

我认为你最好的选择是通过Subjects,正如你所说的。您可以创建自定义的“ObservableArray”(或尝试谷歌搜索,也许有人已经这样做了),观察者可以订阅它,生产者可以推送/删除值。

3) 我上面提到的订阅者类型是什么?

始终保留类型。如果您有Observable<MouseEvent>,则观察者的类型将是Observer<MouseEvent>。把它想象成一个发出 MouseEvents 的 observable 和一个接受 MouseEvents 的观察者。

【讨论】:

  • 非常感谢您的验证 - 我希望观察到的魔力,但看起来我将创建一个新的自定义观察者对象并使用它来实现所需的“处理一个新的数组元素”。
  • 关于订阅者的类型 - 当我将订阅者键入为订阅者时:mLocs$: Subject<MouseLocation>; mouseLocationSubscriber: Subscriber<MouseLocation>; 我得到错误:Type 'Subscription' is not assignable to type 'Subscriber<MouseLocation>'
  • 哦,对了。 .subscribe() 不返回订阅者,而是返回订阅。观察者/订阅者是获得onNextonError 等(你在.subscribe() 中放入的内容)的对象,订阅只是当你想停止接收消息时的一个对象(取决于实现,但是通常是通过调用subscription.dispose())
猜你喜欢
  • 1970-01-01
  • 2015-02-24
  • 2023-04-05
  • 2018-06-11
  • 2016-06-26
  • 1970-01-01
  • 2017-06-16
  • 2019-02-07
  • 1970-01-01
相关资源
最近更新 更多