【发布时间】:2021-10-09 23:21:42
【问题描述】:
我正在尝试编写 Angular 应用程序将切片文件发送到后端。
我正在对文件做什么:
- 将多个文件剪切成数组(每个切片有 1MB)
const array = [];
for (let i = 0; i < this.File.file.size; i += 1048576) {
array.push(this.File.file.slice(i, i + 1048576));
}
- 对于每个文件调用函数 UploadAllSlices()
private UploadAllSlices() {
let sliceNumber = 0;
const fileUploadSub: Subject<void> = new Subject();
const chunkObserver = new Observable(observer => {
const chunkUploadSub: Subscription = fileUploadSub.subscribe(
_ => {
this.uploadFile(sliceNumber).subscribe((chunkReponse: any) => {
// my logic here
},
e => {
console.log('ERROR', e);
}
);
sliceNumber++;
fileUploadSub.next();
});
}).pipe(
takeUntil(this.pause$),
retry(1000)
);
}
- 函数uploadFile(在UploadAllSlices()内部使用)
private uploadFile (index: number) {
const formData = new FormData();
formData.append(); // other data not important
formData.append(); // other data not important
formData.append('SliceContent', this.File.array[index]);
return this.http.patch(URL , formData).pipe(
retry(1000),
takeUntil(this.pause$)
);
}
当我上传 1-3 个文件时,一切正常。但是当我尝试一次上传 10-15 个文件时,一些文件会随机卡住。 (有时所有文件都上传,有时1-2个文件卡住,有时5个文件非常随机地卡住)
对于那些卡住的文件
this.http.patch 没有被执行,所以我无法得到响应并在这里制定我的逻辑:
this.uploadFile(sliceNumber).subscribe((chunkReponse: any) => {
// logic here
}
知道为什么它会随机卡住,为什么订阅不发送http.patch 到后端?
【问题讨论】:
-
你肯定从
UploadAllSlices中遗漏了一些东西,因为这个函数永远不会像写的那样做任何事情,因为它在语法上是无效的。我猜它是一个复制/粘贴错误,因为它适用于 1-3 个文件。但是对于 15 个文件,您需要实现某种批处理方案,而这只是散布着 rxjs 反模式,这会导致 1 使这变得困难,而 2 会使调试变得更加困难
标签: angular typescript rxjs frontend