理解观察者和订阅者angular2

understanding observers and subscibers angular2

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

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

我目前将 observables 理解为 "streams of events that can be watched and acted upon"。数组和请求可以转换为可观察对象,以便观察者可以订阅它们,并且在触发事件时可以对该事件或可观察对象中的数据进行操作。

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

我知道这些可以分开 类 只要订阅者可以访问要订阅的 observable。

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

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

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

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

我的问题是:

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

2) 我可以创建一个标准数组,使其可观察并监听 'added' 或 'modified' 事件吗?

3) 我上面提到的用户类型是什么?

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

请:

1) Is my above understanding of observable & observer/subscriber correct?

您走在正确的轨道上,我认为该定义没有任何错误。也许我只想改变的是,我将 observer/subscribers 合并为一个实体,因为它们完全相同。

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

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

2) can I create a standard array, make it observable and listen to 'added' or 'modified' events?

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

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

但是如您所见,当一个项目被压入数组时,没有办法通知观察者。

可以用来做这样的事情的东西是 Proxies,它允许你拦截在 object/array 中完成的操作......这有点前卫,所以不要太专家在 IE 中得到了很多支持。

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

3) what is the type of the subscriber that I mention above?

类型始终保留。如果你有一个 Observable<MouseEvent>,观察者将是 Observer<MouseEvent> 类型。将其视为发出 MouseEvents 的 Observable 和接受 MouseEvents 的观察者。