我的场景是通过 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
,成功后,我想每5秒
调用getChange
,直到Status.Value !== 'INSYNC'
几个问题:
- flatMap 在做什么?
- 是否可以在不进行 2 次订阅调用的情况下完成此操作?
- 如果我不需要 next 或 error 回调,但需要完整的回调,是否需要声明空主体?
最佳答案
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()
返回一个完成的 Observable -
getChange()
最终将返回“INSYNC” - 未添加错误处理(例如 30 秒后超时?如果
registerDomain()
失败则重试?)
关于rxjs - 完成 rxjs 可观察间隔的正确方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45287074/