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

问题描述 投票:0回答:1

我的场景是通过 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. 如果我不需要 next 或 error 回调,但需要完整的回调,是否需要声明空主体?
rxjs observable
1个回答
2
投票

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()
    失败则重试?)
© www.soinside.com 2019 - 2024. All rights reserved.