在Angular 4.x中使用RxJS,我看到两种非常不同的模式,用于从用户启动的操作流生成Observable。一个流是用户点击“添加项目”的直接结果。生成新对象的按钮。另一个是由我使用的一些第三方代码发布的一系列事件。
我希望能够使用像' combineLatest'这样的东西来组合这两个流。生成一个Observable。
使用我的按钮,我遵循以下模式:
const signal = Observable.create(
(observer) => {
this.additem= (item) => observer.next(item);
}
);
this.item$ = signal.map((item) => [item])
.scan((accumulator, value) => {
return accumulator.concat(value);
});
但是,我看到很多信息说我应该使用Subjects - 我试图将其用于我的事件回调,如下所示:
sort$ = new Subject();
sortChange(sort){
sort$.next(sort);
}
然后我试图将这些结合起来:
combine$ = Observable.combineLatest(sort$, item$,
(sort, items) => {
return "something that does stuff with these";}
);
我的问题是 - 手动'的首选模式是什么?生成流?可观/可观察的对象和对象是否可以连接成一个单独的可观察对象,就像我试图在这里做的那样?
答案 0 :(得分:5)
当然,您可以将Observables和Subjects组合成一个流。
我认为这里的问题是你的用例更有意义。根据您的说明实施类似“添加项目”功能的内容,我希望Subject
优先于Observable.create
。
这是因为每次订阅signal
时,您都会重新分配this.additem
。每个观察者都会调用Observable.create
的回调。请注意,Observable.create
的更正确用法如下所示:
const signal = Observable.create((observer) => {
this.additem = (item) => observer.next(item);
return () => this.additem = null;
});
当您取消订阅此Observable时,将调用返回的回调() => this.additem = null
,这是您应该处理所有清理的地方。
但是,如果您对signal
进行了两次订阅,那么您将覆盖this.additem
两次,然后如果您选择取消订阅其中一位观察者,那么this.additem = null
它可能会导致出乎意料的行为。
所以在这种情况下使用Subject
会更有意义。例如:
const subject = new Subject();
this.additem = (item) => subject.next(item);
如果您想查看Observable.create
的更多真实示例,请查看以下内容:Subscribe to a stream with RxJS and twitter-stream-api module
编辑:另请参阅RxJS 5的首席开发人员的这些文章: