【发布时间】:2021-05-11 10:05:41
【问题描述】:
我在一个 Vue.js 项目中使用 FileReader,但这段代码有问题:
async uploadDocuments(files) {
for (let file of files) {
let fileName = file.name;
let fileContent;
let reader = new FileReader();
reader.onload = async () => {
fileContent = reader.result;
await this.submitFile(fileContent, fileName, fileType)
.then(/* THEN block */)
.catch(/* CATCH block */);
};
reader.onerror = (error) => { console.warn(error); };
reader.readAsDataURL(file);
}
console.log("COMPLETED");
}
async submitFile(fileContent, fileName, fileType) {
// this function should handle the file upload and currently contains a timeout
await new Promise((resolve) => setTimeout(resolve, 3000));
}
这是所需的执行顺序(以两个文件为例):
- (等待 3 秒)
- THEN 块(文件 1)
- (等待 3 秒)
- THEN 块(文件 2)
- 已完成
但这是实际的执行顺序:
- 已完成
- (等待 3 秒)
- 然后阻止
- 然后阻止
超时后“THEN块”正确执行,但for循环中的代码继续执行,无需等待onload函数执行。
如何使阅读器异步?我尝试了很多解决方案(例如将for 循环包装在一个promise 中,并将resolve() 函数放入.then()),但它们都不起作用。
【问题讨论】:
-
为什么要将文件内容读入内存并以base64格式上传?那是最糟糕的。 ~3 更多带宽不必要的处理,没有足够的 RAM 来处理大文件。只需将文件附加到FormData 并将其上传为
application/multipart-formdata
标签: javascript async-await filereader