长时间潜伏 - 第一次海报。 这是很多理论,所以请耐心等待。
我正在努力为可观察,观察者和订阅者(rxjs和angular2)的想法进行精神建模,并希望确保我走在正确的轨道上。
我目前将观察结果理解为“可以观看并采取行动的事件流”。数组和请求可以被转换为可观察的,以便观察者可以订阅它们,并且当事件被触发时可以对该事件或可观察数据中的数据起作用。
我看到订阅者是一种观察者,可以使用3种可能的处理程序观察可观察者:onNext,onComplete和onError。
我知道这些可以在不同的类中,只要订阅者可以访问observable进行订阅。
如果这是准确的描述,请告诉我。
如果这是真的,我很好奇如何使数组可观察,如: 当新项目添加到数组中时,如何订阅该事件并对其采取行动?
我尝试过创建一个数组,用鼠标事件填充它并尝试将此数组转换为Observable。
这失败了,但是我能够创建一个可观察的主题,用next()推送新项目并订阅那些订阅者的下一个事件(我不知道它是什么类型,所以我只是留下它无法输入因为我无法让编译器接受我输入的任何内容。
我的问题是:
1)我对可观察的和观察者/订阅者是否正确?
2)我可以创建一个标准数组,使其可观察并听取“添加”或“修改”事件吗?
3)我上面提到的订户类型是什么?
this.mouseLocationSubscriber = this.mLocs$.subscribe(
X => this.handleNext(X),
err => this.handleSubscriberError(err),
() => console.log('subscriber recd complete')
);
请:
如果这篇文章位置错误,请帮我把它放在正确的位置
如果此帖子格式不正确,请帮助我了解如何格式化以便找到答案的最佳可能性
如果这篇文章是一些类似的丢失代码理论家,请帮我找回答
如果还有其他东西我应该被围攻,我已经为你准备了干草叉:----E
答案 0 :(得分:3)
1)我对可观察的和观察者/订阅者是否正确?
你走在正确的轨道上,没有什么我可以认为这个定义上的错误。也许我会改变的是,我会将观察者/订阅者合并为一个实体,因为它们完全相同。
另外,请记住Observable采用函数式编程方法:当您创建流时,在观察者调用.subscribe()
之前,不会执行任何操作。
人们经常感到困惑的另一件事是使用onError
。当流产生onError
时,意味着发生了不可恢复的崩溃:流关闭,并且不会再次调用onNext
。当人们想要获得某种软错误时,他们会调整Observable类型以包含它,例如isSuccesfull:boolean
或errors:Error[]
2)我可以创建一个标准数组,使其可观察并听取“添加”或“修改”事件吗?
不......可观察者不能做魔法。从Rx.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的可观察对象,以及接受MouseEvents的观察者。