我的场景是通过 aws sdk 将记录集添加到主机区域。添加记录集时,aws sdk 有一个
GetChange
调用,可用于获取该状态。这是我目前正在做的代码:
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
,成功后,我想每隔getChange
调用5 seconds
,直到Status.Value !== 'INSYNC'
几个问题:
Flatmap 又名 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()
返回一个完成的ObservablegetChange()
最终将返回“INSYNC”registerDomain()
失败则重试?)