RxJS:手动发出Observable的正确方法

时间:2017-06-27 14:37:39

标签: angular rxjs

在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";}
        );

我的问题是 - 手动'的首选模式是什么?生成流?可观/可观察的对象和对象是否可以连接成一个单独的可观察对象,就像我试图在这里做的那样?

1 个答案:

答案 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的首席开发人员的这些文章: