2017-09-24 62 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'來代替,因爲在開始另一個之前沒有理由等待完成。 –