6

我正在使用 Angular 服务来允许用户上传文件。

该服务的实施正在运行;我的问题是关于 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(...)
)

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

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

4

1 回答 1

4

您可以使用 just但您必须使用关键字map抛出异常,而不是返回,因为这只会创建另一个 Observable。您也可以使用然后会工作,但它可能不必要地复杂。throwthrowErrormergeMapthrowError

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

单线:

mergeMap(val => val === 42 ? throwError(new Error(`It's broken`)) : of(val))
于 2018-08-21T12:52:08.967 回答