2017-07-24 41 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