在另一个订阅处理程序中订阅一个可观察对象是否很好?

ShM*_*swi 3 observable rxjs

我正在使用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)

ato*_*mrc 5

具有多个可观察对象完全可以,这就是反应式编程的目的:)

但是,这里的问题太多了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)

看看有没有一个订阅会触发副作用,该副作用会修改应用程序的状态

请注意,我自愿为您简化了代码(删除了错误处理和检查),以使您了解如何执行此操作。

我希望它可以帮助您在反应式编程中进行思考:)