2017-09-24 82 views
3

在这里,我用rxjs中的forkJoin并行地订阅了一系列观察对象。但我想逐一订阅,最好的解决方案是什么?按顺序订阅一系列可观察对象

下面是我的代码:

var observables = []; 

Observable.forkJoin(observables) 
    .subscribe(() => { 
     this.msgs = []; 
     this.msgs.push({ 
      severity: 'success', 
      summary: 'Saved Successfully' 
     }); 
     this.onSaveComplete(); 
    }, (error: any) => this.errorMessage = <any>error); 
}, (error: any) => this.errorMessage = <any>error); 

回答

1

forkJoin的替代意味着您需要按顺序订阅observables数组。 mergeconcat是在这种情况下去的方法。在你的情况下,当使用mergeconcat时,修改你的代码并在可观测数组的最开始处使用扩展运算符。

var observables = []; 
Observable.concat(...observables) 
      .subscribe(() => { 
       this.msgs = []; 
       this.msgs.push({ 
        severity: 'success', 
        summary: 'Saved Successfully' 
       }); 
       this.onSaveComplete(); 
      }, (error: any) => this.errorMessage = <any>error); 
    }, (error: any) => this.errorMessage = <any>error); 
+0

谢谢,它的工作:) –

0

使用the switchMap operator作出一系列相关请求的。错误会传播,您可以在链的末尾捕获或以其他方式处理它们。

return this.http.get('something/1') 
    .switchMap(res1 => { 
    // use res1 if you need it 
    return this.http.get('something/2') 
    }) 
    .switchMap(res2 => { 
    // use res2 if you need it 
    return this.http.get('something/3') 
    }) 
    .subscribe(res3 => { 
    // use the final response 
    console.log(res3) 
    }) 
+0

感谢兄弟的回复。我想动态地做这个操作。我的意思是可观察项目的数量可能是2或4或11等,动态我怎么能解决这个问题? –

+0

这一切都取决于您的自定义逻辑使用以前的结果来确定下一个请求。我无法帮助您了解更多信息。如果你的请求不依赖于另一个请求,那么你应该使用'forkJoin'来代替,因为在开始另一个之前没有理由等待完成。 –