2017-07-24 46 views
1

我的方案是我通過aws sdk將記錄集添加到主機區。添加記錄集時,aws sdk有一個GetChange調用,可用於獲取該狀態。這是我目前做的代碼:完成rxjs可觀察間隔的正確方法?

this._adminService.registerDomain(caseWebsiteUrl.Url). 
    subscribe(id => { 
     return Observable.interval(5000).flatMap(() => { 
     return this._adminService.getChange(id); 
     }). 
     takeWhile((s) => s.ChangeInfo.Status.Value !== 'INSYNC').subscribe(
     () => { 

     }, 
     () => { 

     }, 
     () => this.urlStatus = 'fa fa-check'); 

    }); 

在上面的代碼,我想打電話給registerDomain並已成功後,我想打電話給getChange5 seconds直到Status.Value !== 'INSYNC'

的幾個問題:

  1. flatMap在幹什麼?
  2. 是否有可能做到這一點,而不需要2次訂閱呼叫?
  3. 如果我不需要下一個或錯誤的回調,但我需要完整的,是否有必要申報空身?

回答

1

平面圖aka MergeMap將展平更高階的觀測值。因此Observable<Observable<T>> => Observable<T>

訂閱訂閱是一種代碼氣味,可以並且應該重構。如果你不需要錯誤/完整的處理程序,你不需要通過這些。例如:

function registerDomain(caseWebsiteUrl) { 
    return this._adminService.registerDomain(caseWebsiteUrl.Url) 
     .concatMap(registerId => Observable.interval(5000) 
     .mergeMap(() => this._adminService.getChange(registerId)) 
     .takeWhile((info) => info.ChangeInfo.Status.Value !== 'INSYNC') 
    ) 
    } 
    registerDomain.subscribe(res => console.log('res:'+res)); 

這部作品基於這樣的假設和限制:

  • registerDomain()返回一個可觀察其完成
  • getChange()最終會回到「INSYNC」
  • 沒有錯誤處理已(例如30秒後超時?如果registerDomain()失敗,請重試?)
+0

我應該如何重構訂閱?我需要完整的。我不需要接下來的錯誤。 – xaisoft

+0

我已經添加了一個重構示例 –

+0

您可以詳細說明concatMap和mergeMap嗎? – xaisoft