【发布时间】:2018-03-09 19:23:38
【问题描述】:
我正在尝试组合两个 Observable,并根据一个或两个的结果发出一个事件。
过度简化的代码:
export class MyDirective {
// Filter properties
filter = new ReplaySubject<any>();
}
export class MyComponent implements AfterContentInit {
// First observable (my own creation)
@ContentChildren(MyDirective) columns: MyDirective[];
filterChange = Observable.merge(...this.columns.map(c => c.filter));
// Second observable (EventEmitter from a component library)
@ViewChild(MdSort) sort: MdSort;
ngAfterContentInit() {
// Now merge them and call a function with the results from both
Observable.xxx([ this.sort.sortChange, this.filterChange ]).subscribe(res => {
this.readData(res.sort, res.filter);
});
}
readData(sort?: any, filter?: any) {
// This method should receive the results from the observables
}
}
解决方案尝试:
我尝试了不同的方法来合并这些:
Observable.merge
Observable.merge(this.sort.sortChange, this.filterChange).subscribe(res => {
// Gives me no clue as to which of the observables has been fired
// and thus I cannot process properties
});
Observable.zip
Observable.zip(this.sort.sortChange, this.filterChange, (sort, filter) => {
// I never reach this spot. Why?
this.readData(sort, filter);
});
同时订阅两者
这可行,但我对此不满意。我希望以某种方式使用 Observable 合并来完成此操作...
// On any changes, read data
let sort; let filter;
this.sort.sortChange.subscribe(s => sort = s);
this.filterChange.subscribe(f => filter = f);
this.Observable.merge(this.sortChange, this.filterChange).subscribe(result => {
// Fired whenever any of the two are changed
this.readData(sort, filter);
});
【问题讨论】:
-
您在寻找 combineLatest 吗?我建议看看例如rxmarbles.com
-
或者值得一看的可能是 .mergeMap 运算符
-
combineLatest要求在收集结果之前触发两个可观察对象?如果是这样,我不能使用它。不过谢谢你的建议。mergeMap是变压器,对吧?所以我需要先合并这两个 observable,然后才能在其上运行转换器。我应该首先使用什么来组合 observables?
标签: angular rxjs observable