寻找RxJS运营商

6 rxjs typescript angular rxjs-pipeable-operators

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

该服务的实施正在发挥作用; 我的问题是关于RxJS及其可管理的运算符,但这里是服务签名以防万一:

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

对此服务的调用如下:

  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 */});
Run Code Online (Sandbox Code Playgroud)

我想找到一个代替unknownOperator它的运算符如果不满足条件就会抛出错误.

我试过了

  • filter :如果条件不满足,代码会在之后停止,
  • map :即使出现错误,代码仍会继续 throwError

我想过用下面的管道

.pipe(
  map(...),
  catchError(...),
  mergeMap(...)
)
Run Code Online (Sandbox Code Playgroud)

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

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

mar*_*tin 4

你可以使用 justmap但你必须用关键字抛出异常throw,而不是返回,throwError因为这只会创建另一个 Observable。您也可以使用mergeMapand thenthrowError来工作,但它可能不必要地复杂。

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

单行:

mergeMap(val => val === 42 ? throwError(new Error(`It's broken`)) : of(val))
Run Code Online (Sandbox Code Playgroud)

  • 好吧,您可以将其放入自定义运算符中。 (2认同)