我正在使用Angular2,但我有一个问题,即如果我有很多可观察对象,那么最佳方法是什么。我可以将预订相互放置,还是可以将每个预订使用不同的方法,然后将结果放置在类属性中?
范例:
ngOnInit() {
this.route.params**.subscribe**(params => {
if (params['id']) {
this.load = true;
this.batchService.getPagesOfCurrentObject(params['id'], "10", "0")
**.subscribe**(result => {
this.stream = result;
if (this.stream.length > 0) {
this.stream.forEach(page => { this.batchService.getPageStreamById
(page.pageId)**.subscribe**(pageStream => {
let base64 = btoa(new Uint8Array(pageStream.data)
.reduce((data, byte)
=> data + String.fromCharCode(byte), ''));
this.pages.push(base64 );
})
return;
});
}
},
error => this.errorService.setError(<any>error),
() => this.load = false
);
}
});
try {
this.customer = this.sharedService.processSelect.subscription.customer;
} catch (err) {
return;
}
}
Run Code Online (Sandbox Code Playgroud)
具有多个可观察对象完全可以,这就是反应式编程的目的:)
但是,这里的问题太多了subscribe。请记住,这subscribe是一种产生副作用的方法。为了使代码易于阅读,您应尽量使用subscribe。
您的用例对于mergeMap操作员而言是完美的用例,它使您可以展平嵌套的可观察对象。
这是您的代码的样子
const response$ = this.route.params
.mergeMap(params => {
return this.batchService.getPagesOfCurrentObject(params['id'])
})
.mergeMap(stream => {
return Rx.Observable.merge(stream.map(page => this.batchService.getPageStreamById(page.pageId))
})
.map(pageStream => /* do your stuff with pageStream, base64 ... */)
response$.subscribe(pageStreamData => pages.push(pageStreamData))
Run Code Online (Sandbox Code Playgroud)
看看有没有一个订阅会触发副作用,该副作用会修改应用程序的状态
请注意,我自愿为您简化了代码(删除了错误处理和检查),以使您了解如何执行此操作。
我希望它可以帮助您在反应式编程中进行思考:)
| 归档时间: |
|
| 查看次数: |
3126 次 |
| 最近记录: |