Rxjs有条件地进行第二次http调用

时间:2019-03-08 23:28:41

标签: rxjs

我正在尝试了解rxjs(6)以及应该如何有条件地打电话给我写第二篇http post。

我的情况是:

  1. 我已经上传了文件。
  2. 我得到一个用于标识当前进度和文件名的对象。
  3. 如果当前进度为100,我想发表第二个http帖子,并在第二次调用成功后返回进度和文件名
  4. 如果当前进度小于100,只需返回进度和文件名

我的课程

export class BasePortalDetailsManagerService {
   updateCertificate(file: File): Observable<IUploadProgress> {
    return this._azureBlobStorage
               .uploadCertificateToBlobStorage2(file, this.portalKey)
               .pipe(
                  map(progress => this.mapProgress2(progress))
                );
  }

  private mapProgress2(fileProgress: FileProgress): IUploadProgress {
    if (fileProgress.Progress === 100) {
      console.log('I can do something here but there must be a better way');

    } else {
      return {
        filename: fileProgress.FilePath,
        progress: fileProgress.Progress
      };
    }
  }   
}

我一直在看和读各种各样的东西,似乎唯一发生的是,这使我确信我的方法是错误的。我似乎无法理解各种教程。

我关注的各种链接

rxjs quick start

cory rylan

rxjs where is the if/else

1 个答案:

答案 0 :(得分:0)

使用map而不是concatMap并根据progress返回用of(progress)包裹在Observable中的原始对象,或者返回另一个使第二个请求并映射其请求的Observable结果到progress

this._azureBlobStorage.uploadCertificateToBlobStorage2(file, this.portalKey).pipe(
  concatMap(progress => progress.Progress === 100
    ? this.mapProgress2(progress).pipe(
        map(filename => ({ // This could go inside `mapProgress2` as well
          filename: progress.FilePath,
          progress: progress.Progress
        })),
      )
    : of(progress)
  ),
);