【发布时间】:2019-09-04 14:49:18
【问题描述】:
我创建了一个 Google Apps Script Web 应用程序,用于将图像上传到我的 Google Drive。它有很多行,每一行都有一个用于上传文件的输入标签。我创建了一个唯一的提交按钮来一次上传所有选择的图像。但是,我希望每一行都按顺序上传每个图像,然后在按顺序成功上传后删除该行。问题是我找不到使用 async/await 函数通过 FileReader 将图像上传到 Drive 的正确方法,因为当我运行脚本时,它仍然作为异步函数工作。
async function uploadImage() {
var row = document.getElementsByClassName('row');
var file = document.getElementsByClassName('img-file');
var name = document.getElementsByClassName('img-name');
for (let i=0; i<row.length; i++) {
var image = file[i].files[0];
if (image) {
var reader = new FileReader();
reader.readAsDataURL(image);
reader.onloadend = async (event) => {
await new Promise((resolve, reject) => {
google.script.run.withSuccessHandler(r => resolve())
.uploadImgToDrive(name[i].value, event.target.result)
}).then(() => row[i].innerHTML='');
}
}
}
}
【问题讨论】:
-
现在有什么问题?有错误吗?
-
@TheMaster 问题是每行在成功上传时都没有按顺序删除。谢谢。
-
但是不同的图片有不同的尺寸。
uploadImgToDrive对于 image5 可能会更早返回,而 image1 可能会稍后完成,即使 image1 在 image5 之前开始上传。同步或排序可能需要更多时间。并行操作更快。 -
@TheMaster 是对的...但考虑到它还取决于吞吐量、延迟、API 限制等。我建议删除所有行并显示一个全局加载栏或让它们消失使用酷炫的动画订购。
-
@TheMaster 谢谢你的建议。
标签: javascript google-apps-script async-await filereader