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

寻找RXJS操作员

  •  6
  • Maryannah  · 技术社区  · 6 年前

    我使用一个角度服务,允许用户上传文件。

    服务的实现正在工作;我的问题是关于RXJS及其可管道操作器,但这里是服务签名,以防万一:

    askUserForFile(): Observable<File>;
    toBase64(file: File): Observable<string>;
    isFileValid(file: File, configuration?: { size?: number, extensions?: string | string[] }): boolean;
    

    此服务的调用如下:

      this.fileService
        .askUserForFile()
        .pipe(
          // this is the operator I'm looking for 
          unknownOperator(file => this.fileService.isFileValid(file, { extensions: ['txt'] }))
          mergeMap(file => {
            fichier.filename = file.name;
            return this.fileService.toBase64(file);
          }))
        .subscribe(base64 => {
          fichier.base64 = base64;
          // Rest of my code
        }, error => {/* error handling */});
    

    我想找个接线员代替 unknownOperator 如果条件不满足,就会抛出一个错误。

    我试过了

    • filter :如果不满足条件,代码将在该条件之后停止,
    • map :即使在引发错误时 throwError

    我想用下面的管道

    .pipe(
      map(...),
      catchError(...),
      mergeMap(...)
    )
    

    我认为这可能有效,但我想找一个(如果可能的话)缩短管道的操作员。

    有可能吗?如果没有,有更好的管道吗?

    1 回复  |  直到 6 年前
        1
  •  4
  •   martin    6 年前

    你可以只用 map 但是你必须破例 throw 关键字,不返回 throwError 因为这只是创造了另一个可观察的。你也可以用 mergeMap 然后 投掷误差 可以,但可能不必要地复杂。

    map(val => {
      if (val === 42) {
        throw new Error(`It's broken`);
      }
      return val;
    })
    

    oneliner:

    mergeMap(val => val === 42 ? throwError(new Error(`It's broken`)) : of(val))