代码之家  ›  专栏  ›  技术社区  ›  xaisoft

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

  •  1
  • xaisoft  · 技术社区  · 7 年前

    我的场景是通过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. 如果我不需要next或error回调,但需要完整的回调,那么有必要声明空体吗?
    1 回复  |  直到 7 年前
        1
  •  1
  •   Mark van Straten    7 年前

    Flatmap又名MergeMap,将使高阶观测值变平。因此 Observable<Observable<T>> => Observable<T>

    subscribe内部的subscribe是一种代码味道,可以而且应该重构。如果不需要错误/完整处理程序,则不需要传递这些处理程序。例如:

     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()
    • getChange()
    • 未添加错误处理(例如30秒后超时?如果需要,请重试 registerDomain()