【发布时间】:2019-09-17 23:29:38
【问题描述】:
我正在尝试将一组文件上传到 s3 存储桶。我正在为每个文件构建一组承诺,生成预签名的 URL,对文件进行 blob,然后进行上传。上传完成后,每个承诺应该解析。
当所有上传完成后,我尝试刷新页面。
我正在尝试使用以下代码执行此操作:
async function uploadFiles() {
let requestArray = files.map(file => {
return new Promise(resolve => {
handleDocs.GenerateUrl(file.fileName, "{!OppName}", async (result, event) => {
let preSignedUrl = result.Data.toString().replace(/amp;/gm, "");
let blob = b64toBlob(file.fileString, result.ContentType);
await fetch(preSignedUrl, {
method: "PUT",
body: blob,
headers: {
"Content-Type": result.ContentType,
},
});
resolve();
});
});
});
await Promise.all(requestArray);
document.location.reload();
}
我的猜测是handleDocs.GenerateUrl 的行为方式我不理解(它是对实际生成预签名 URL 的后端 Salesforce/APEX 服务的调用),我正在执行承诺不正确。
我找不到任何可以解决类似问题并且对我有用的示例。
实际逻辑似乎很好,因为大多数情况下文件确实上传成功。我如何建立承诺有什么问题吗?
任何帮助将不胜感激!
我意识到已经有一个关于此的问题,但根本问题似乎有所不同。
【问题讨论】:
-
试试 Promise.all(requestArray).then(document.location.reload());
-
抱歉,您如何确认
await Promise.all(...)在重新加载之前没有等待承诺解决? -
@Frazer 你为什么要那样做?那里已经有一个
await -
如果其中一个请求失败,
Promise.all()会提前返回,确保没有发生这种情况。在您的Promise.all()周围添加一个 try/catch -
旁注:
let preSignedUrl = result.Data.toString().replace(/amp;/gm, "")这是什么?你不应该是HTML解码吗?
标签: javascript promise