在Angular 13上,可能会遇到文件上传请求被取消的问题。这通常是由于用户在文件上传过程中通过点击取消按钮或导航到其他页面等方式来取消请求造成的。
要解决这个问题,可以使用RxJS的takeUntil操作符来订阅组件的销毁事件,以便在组件被销毁时取消上传请求。以下是一个示例代码:
@Component({ selector: 'app-file-upload', templateUrl: './file-upload.component.html', styleUrls: ['./file-upload.component.css'] }) export class FileUploadComponent implements OnDestroy { private destroy$ = new Subject(); public fileToUpload: File | null = null; public progress: number = 0;
constructor(private httpClient: HttpClient) {}
ngOnDestroy() { this.destroy$.next(); this.destroy$.complete(); }
onSubmit() { if (!this.fileToUpload) { return; }
const formData = new FormData();
formData.append('file', this.fileToUpload);
this.httpClient.post('/api/upload', formData, {
reportProgress: true,
observe: 'events',
}).pipe(
takeUntil(this.destroy$)
).subscribe((event: HttpEvent) => {
switch (event.type) {
case HttpEventType.Sent:
console.log('Request sent!');
break;
case HttpEventType.UploadProgress:
this.progress = Math.round((event.loaded / event.total) * 100);
console.log(`Uploaded ${this.progress}%`);
break;
case HttpEventType.Response:
console.log('Upload complete!');
break;
}
});
} }
在上面的代码中,我们创建了一个名为destroy$的Subject类型的私有属性,并在组件销毁时通过在ngOnDestroy方法中调用next方法和complete方法来销毁它。我们还使用takeUntil操作符来订阅这个Subject,以便在组件销毁时取消上传请求。
通过这种方式,我们可以确保在Angular 13上处理文件上传请求时避免取消请求的问题。