正确的方法来完成rxjs可观察的间隔?

时间:2017-07-24 17:57:02

标签: rxjs observable

我的方案是我通过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'

几个问题:

  1. flatMap在做什么?
  2. 如果没有2个订阅电话,是否可以这样做?
  3. 如果我不需要下一个或错误的回调,但我需要完整,是否有必要声明空体?

1 个答案:

答案 0 :(得分:1)

Flatmap 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()返回完成的Observable
  • getChange()最终将返回'INSYNC'
  • 未添加错误处理(例如30秒后超时?如果registerDomain()失败则重试?)