javascript - 如何在订阅功能上捕获错误?
问题描述
我有这个功能来上传我的文件fileUploadService
:
fileUpload(formData: any) {
return this.http.post(`${this.apiUrl}/upload`, formData, {
reportProgress: true,
observe: 'events'
}).pipe(
map(event => this.getEventMessage(event))
);
}
private getEventMessage(event: HttpEvent<any>) {
switch (event.type) {
case HttpEventType.UploadProgress:
return this.fileUploadProgress(event);
case HttpEventType.Response:
return event.body;
default:
return `Upload event: ${event.type}.`;
}
}
private fileUploadProgress(event: any) {
const percentDone = Math.round(100 * event.loaded / event.total);
return { progress: percentDone, files: [] };
}
在我的一个组件上,我将这段代码称为:
this.fileUploadService.fileUpload(formData).subscribe(
result => {
this.upload = result;
}
)
现在我的问题是,如果网络服务器抛出错误,因此 http post 函数失败并且需要被捕获,我如何才能在我的组件中而不是在服务中捕获错误?
解决方案
Observables 发出三种类型的事件:next、complete和error。.subscribe()
方法接受所有三种类型的侦听器作为参数列表:
subscribe(next?: ((value: T) => void) | null, error?: ((error: any) => void) | null, complete?: (() => void) | null)
或作为类型的单个对象参数Partial<Observer<T>>
:
subscribe(observer?: Partial<Observer<T>>)
Observer<T>
具有三个属性:
export interface Observer<T> {
complete: () => void;
error: (err: any) => void;
next: (value: T) => void;
}
这意味着您有两个选项来传递下一个和错误处理程序。要么使用:
.fileUpload(formData).subscribe(
result => console.log('Success!', result),
error => console.log('Error :(', error),
)
或者:
.fileUpload(formData).subscribe({
next: result => console.log('Success!', result),
error: error => console.log('Error :(', error),
})
第二种变体在社区中更可取。
推荐阅读
- mysql - MySQL - 仅根据不同条件选择某些行
- java - 策略创建的 OpenAM 问题
- openedge - 我如何从 1 个变量中获得最长的单词
- javascript - 如何制作像 Google Analytics/Facebook Pixel/Anothers 脚本这样的片段?
- javascript - jquery按钮点击检测
- python - 当我在服务器中配置 Django 和 Nginx 时,为什么几个小时后失去 mysql 连接?
- r - 将单个变量(即向量)通过管道传输到 ggplot?
- python - 情绪 = model.predict(twt,batch_size=1,verbose = 2)[0] 是什么意思?
- php - Laravel 邮件提供发件人详细信息
- sql - 在 Oracle SQL 或 PL/SQL 中根据名称和计数合并相似的行