axios切片上传怎么才能实现同步上传,下一片上传文件需要根据上一片的返回状态码,再决定是否上传?
我需要怎么把以下的代码,改成问题中的需求呢?
forEach和async和await在一起不能实现同步,
不太懂前端,,很抓狂,求大神仔细讲解
这是在开始上传文件之前,需要先获取文件的在服务器的中状态信息,查看是否已经上传过。
{iCode: 0, strMessage: "Success",…}
iCode: 0
objData: [
{iFileId: 0, strFileName: "1_1000080.zyp", lSize: 101053451, strFileType: "zyp",…}]
0: {iFileId: 0, strFileName: "1_1000080.zyp", lSize: 101053451, strFileType: "zyp",…}
iFileId: 0
lSize: 101053451
listFileSliceInfo: [{lSize: 101053451, strFilePath: "", strStatus: "complete", lProgress: 0}]
0: {lSize: 101053451, strFilePath: "", strStatus: "complete", lProgress: 0}
lProgress: 0
lSize: 101053451
strFilePath: ""
strStatus: "complete"
strFileName: "1_1000080.zyp"
strFileType: "zyp"
strMessage: "Success"
emitHandle() {
//上传文件
let iUpdadeState = 0;
this.testFilesStatus.forEach((item, index) => {
let obj = item[0].listFileSliceInfo[0];
if (obj.strStatus == "none") {
iUpdadeState = 0;
} else {
iUpdadeState = 1;
}
let lSize = this.testFiles[index].file.size;
const sectionSize = 1 * 1024 * 1024;
const sectionTotal = Math.ceil(lSize / sectionSize);
for (let i = 0; i < sectionTotal; i++) {
const startSize = i * sectionSize; // 切片开始位置
const endSize =
i === sectionTotal - 1 ? lSize : (i + 1) * sectionSize;
let fileData = this.testFiles[index].file.slice(startSize, endSize);
if (this.progress) {
let formData = new FormData();
formData.append("file", fileData);
formData.append("iUpdadeState", iUpdadeState);
formData.append("iSlideDocumentId", item[0].iFileId);
formData.append("strFilePath", "");
FileUploadHandler(formData, (spreed) => {
// 总大小
let loaded = 0;
loaded += spreed.loaded;
let sep =
(((loaded / this.testFiles[index].file.total) * 100) | 0) +"%";
this.testFiles[index].file.status = sep;
});
}
}
});
},
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
把上传单个分片文件写成一个递归函数。
forEach
自然是不可以的,因为它不会受回调函数返回值的影响,可以用for...in
或者for...of
。之前回答了一个问题,提供了一个异步队列的方案:
如果不考虑传输失败的问题的话,放到这里是可以直接用的:
如果需要考虑失败重试的话需要递归实现,这个方案也可以使用,但是没有啥优势: