寻找 RxJS 操作员
Looking for an RxJS operator
我正在使用 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(...)
)
我认为这可能行得通,但我想(如果可能的话)找到一个可以缩短这条管道的操作员。
可能吗?如果没有,是否有更好的管道?
你可以只使用 map
但你必须用 throw
关键字抛出异常,而不是返回 throwError
因为这只会创建另一个 Observable。您也可以使用 mergeMap
然后 throwError
会起作用,但它可能不必要地复杂。
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))
我正在使用 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(...)
)
我认为这可能行得通,但我想(如果可能的话)找到一个可以缩短这条管道的操作员。
可能吗?如果没有,是否有更好的管道?
你可以只使用 map
但你必须用 throw
关键字抛出异常,而不是返回 throwError
因为这只会创建另一个 Observable。您也可以使用 mergeMap
然后 throwError
会起作用,但它可能不必要地复杂。
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))