- 在 Angular 项目中引入 RxJs 库:
import { Observable } from 'rxjs/Observable';
import { BehaviorSubject } from 'rxjs/BehaviorSubject';
import { Subscription } from 'rxjs/Subscription';
import { ajax } from 'rxjs/observable/dom/ajax';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/scan';
import 'rxjs/add/operator/takeUntil';
import 'rxjs/add/operator/startWith';
import 'rxjs/add/operator/catch';
- 创建一个 Service 来下载文件,并且带有进度监测功能:
@Injectable()
export class DownloadService {
progress$: BehaviorSubject = new BehaviorSubject(0);
progress: number = 0;
subscription: Subscription;
constructor() { }
downloadFile(url: string, fileName: string): Observable {
return Observable.create(observer => {
this.subscription = ajax({
url: url,
responseType: 'blob',
progressSubscriber: progress => {
this.updateProgress(progress.loaded, progress.total);
}
}).map(xhr => xhr.response)
.subscribe(data => {
observer.next(data);
observer.complete();
}, error => {
observer.error(error);
});
});
}
updateProgress(loaded: number, total: number) {
if (total === 0) {
this.progress = 0;
} else {
this.progress = Math.round(loaded / total * 100);
}
this.progress$.next(this.progress);
}
cancelDownload() {
if (this.subscription) {
this.subscription.unsubscribe();
}
}
}
- 在组件的代码中使用下载服务,并且监听服务的进度:
export class DownloadComponent {
// 初始化变量
isDownloading: boolean = false;
fileName = 'example.pdf';
constructor(private downlaodService: DownloadService) { }
downloadFile() {
this.isDownloading = true;
const url = 'http://localhost:8080/api/download';
this.downlaodService.downloadFile(url, this.fileName)
.takeUntil(this.cancelDownload)
.subscribe(
data => {
saveAs(data, this.fileName);
},
error => {
console.log(error);
},
()