js类线程问题

157 阅读1分钟
 // 并发处理
   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++; 令人困扰为什么会释放通道,求解