Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/472.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 异步循环似乎部分并行_Javascript_Asynchronous_Async Await_Axios - Fatal编程技术网

Javascript 异步循环似乎部分并行

Javascript 异步循环似乎部分并行,javascript,asynchronous,async-await,axios,Javascript,Asynchronous,Async Await,Axios,我正在尝试实现一个函数,该函数将一个文件切成块,然后将它们一个接一个地发送到我的后端 函数必须对每个文件进行散列,并在开始上载之前验证散列是否已知。 下面的代码是代码部分,其中调用了我的有问题的函数 进程:异步( 字段名, 文件 元数据, 负载 错误, 进步, 中止 转移 选项, ) => { //fieldName是输入字段的名称-与我们没有直接关系 //logger.log(`fieldName:${fieldName}`); //通常为空-可以使用元数据插件添加 //logger.log(

我正在尝试实现一个函数,该函数将一个文件切成块,然后将它们一个接一个地发送到我的后端

函数必须对每个文件进行散列,并在开始上载之前验证散列是否已知。 下面的代码是代码部分,其中调用了我的有问题的函数

进程:异步(
字段名,
文件
元数据,
负载
错误,
进步,
中止
转移
选项,
) => {
//fieldName是输入字段的名称-与我们没有直接关系
//logger.log(`fieldName:${fieldName}`);
//通常为空-可以使用元数据插件添加
//logger.log(元数据);
const source=this.$axios.CancelToken.source();
常量中止进程=()=>{
//如果用户点击了取消按钮,则输入此功能
source.cancel('用户取消操作');
//让FilePond知道请求已被取消
中止();
};
让chunks=[];
常数{
大部队,,
chunkRetryDelays,
chunkServer,
块大小,
chunkTransferId,
上传,
}=期权;
//文件所需的参数
const{name,size}=文件;
if(chunkTransferId){
/**在这里,我们处理当按下重试按钮时发生的情况*/
log(`已定义:${chunkTransferId}`);
返回{abortProcess};
}
这个.hashFile(文件)
。然后((散列)=>{
log(`File Hashed:${hash}`);
if(hash.length==0){
错误('哈希不可计算');
}
返回散列;
})
。然后((散列)=>{
log(`Hash passed-through:${Hash}`);
返回此.requestTransferId(文件、哈希、source.token)
。然后((transferId)=>{
log(`T-ID received:${transferId}`);
返回transferId;
})
.catch((错误)=>{
错误(err);
});
})
。然后((transferId)=>{
转让(转让ID);
log(`T-ID通过:${transferId}`);
//将文件拆分为块以准备上载
chunks=this.splitintockunks(文件,chunkSize);
//过滤区块-删除所有已成功上传的区块
常量filteredChunks=chunks.filter(
(chunk)=>chunk.status!==ChunkStatus.COMPLETE,
);
logger.log(filteredChunks);
返回此文件。上载块(
过滤块,
{name,size,transferId},
进步,
错误,
source.token,
)。然后(()=>transferId);
})
。然后((transferId)=>{
//现在一切都应该上传->设置进度为100%,并使项目显示完成
进度(真实、大小、大小);
加载(transferId);
logger.log(transferId);
})
.catch((err)=>error(err));
返回{abortProcess};
},
uploadChunks
是问题的起点

异步上传块(块、选项、进度、错误、取消令牌){
常量{name,size,transferId}=options;
for(让index=0;index{
chunk.status=ChunkStatus.COMPLETE;
偏移量+=chunk.chunk.size;
进度(真实、偏移、大小);
logger.log(offset);//这始终是chunk.chunk.size,而不是变大
})
.catch((错误)=>{
chunk.status=ChunkStatus.ERROR;
错误(err);
});
}
},
uploadChunk(文件块、选项、偏移量){
常量{name,size,transferId}=options;
const apiURL=`${this.$config.api_url}/filepond/patch?id=${transferId}`;
返回此.$axios.$patch(APIRL、fileChunk、{
标题:{
“内容类型”:“应用程序/偏移量+八位字节流”,
“上载名称”:名称,
“上载长度”:大小,
“上载偏移量”:偏移量,
},
});
},
正如您所看到的,
uploadChunks
采用了一组块、一些选项、两个函数(progress&error)和一个cancelToken(我目前没有使用,因为我仍然无法解决这个问题)

数组中的每个块的形式如下:

{
状态:0,//某些状态指示是否已完成
块://二进制数据
}
函数
uploadChunks
迭代块数组,理论上应该一个块一个地上传,每次上传后总是增加
offset
,然后调用
progress
。在此之后,它应该开始循环的下一个迭代,其中
offset
将比之前的调用中更大

调用本身一个接一个地执行,但是每个调用都有相同的
偏移量
,并且
进度
不会被重复调用。相反,我的进度条会一直锁定,直到所有内容都上传完毕,并且由于在末尾的第一个函数中调用了
load
,进度条会跳到
100%

因此,上传本身可以按照正确的顺序正常工作,但是
之后的所有代码都在等待。uploadChunk…
不会在每个块之后被调用,因此会阻塞