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

标签 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,成功后,我想每5秒调用getChange,直到Status.Value !== 'INSYNC'

几个问题:

  1. flatMap 在做什么?
  2. 是否可以在不进行 2 次订阅调用的情况下完成此操作?
  3. 如果我不需要 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/

相关文章:

javascript - 一旦 Rx.Observable 中发生错误,ValueChanges 就会停止工作

javascript - 如何将 map 运算符用作mergeMap?

angular - 当函数返回间隔时,AsyncPipe 不工作

javascript - rxjs observable.pipe(take(1)) vs toPromise

javascript - 等待两个 observable 完成 zip

javascript - Rxjs ReplaySubject 在发出之前用 'null' 值初始化 - Angular 7

javascript - 如何从 Rxjs 订阅方法返回一个数组?

javascript - 如何将数据从父组件发送到特定的动态创建的子组件?

组件中的Angular 2重复订阅

rxjs - ngrx + 弹珠测试 + 延迟