// 并发处理
sendRequest(forms, chunkData) {
console.log('sendRequest -> forms', forms);
console.log('sendRequest -> chunkData', chunkData);
var finished = 0;
const total = forms.length;
const that = this;
const retryArr = []; // 数组存储每个文件hash请求的重试次数,做累加 比如[1,0,2],就是第0个文件切片报错1次,第2个报错2次
return new Promise((resolve, reject) => {
const handler = () => {
console.log('handler -> forms', forms);
if (forms.length) {
// 出栈
const formInfo = forms.shift();
const formData = formInfo.formData;
const index = formInfo.index;
instance
.post('fileChunk', formData, {
onUploadProgress: that.createProgresshandler(chunkData[index]),
cancelToken: new CancelToken((c) => this.cancels.push(c)),
timeout: 0
})
.then((res) => {
console.log('handler -> res', res);
// 更改状态
chunkData[index].uploaded = true;
chunkData[index].status = 'success';
// 存储已上传的切片下标
this.addChunkStorage(chunkData[index].fileHash, index);
finished++;
handler();
})
.catch((e) => {
// 若状态为暂停或等待,则禁止重试
console.log('handler -> this.status', this.status);
if ([Status.pause, Status.wait].includes(this.status)) return;
console.warn('出现错误', e);
console.log('handler -> retryArr', retryArr);
if (typeof retryArr[index] !== 'number') {
retryArr[index] = 0;
}
// 更新状态
chunkData[index].status = 'warning';
// 累加错误次数
retryArr[index]++;
// 重试3次
if (retryArr[index] >= this.chunkRetry) {
console.warn(' 重试失败--- > handler -> retryArr', retryArr, chunkData[index].hash);
return reject('重试失败', retryArr);
}
console.log('handler -> retryArr[finished]', `${chunkData[index].hash}--进行第 ${retryArr[index]} '次重试'`);
console.log(retryArr);
this.tempThreads++; // 释放当前占用的通道
// 将失败的重新加入队列
forms.push(formInfo);
handler();
});
}
if (finished >= total) {
resolve('done');
}
};
// 控制并发
for (let i = 0; i < this.tempThreads; i++) {
handler();
}
});
}
this.tempThreads++; 令人困扰为什么会释放通道,求解