javascript - Javascript异步如何等待不同数量的uploadTasks全部完成?
问题描述
我有saveBlogPost()
需要执行以下操作的功能:
- 调用该
uploadImages()
函数将 blogPost 的图像更新到 Firebase 存储。图像数量不固定。 - 等待所有图像的上传成功或错误完成。如果成功,每个图像的 URL 将在 blogPost 对象中可用。
- 根据上传的结果行动
- 如果成功:将帖子保存到 Firestore
- 如果失败:向用户显示错误消息
我的问题是如何等待不同数量的上传?
到目前为止,这是我的代码:
savePost() 函数:
function savePost() {
uploadImages();
}
上传图片()函数:
注意: images
是要上传的图像文件的数组。
function uploadImages() {
images.forEach((image) => {
const uploadTask = storageRef.put(file,metadata);
uploadTask.on('state_changed',
function progress() {
//UPLOAD PROGRESS BAR
},
function error(err) {
//SET ERROR
},
function complete() {
//UPDATE IMAGE URL IN BLOGPOST OBJECT
//SET COMPLETE
}
});
}
问题:
我的意图是创造savePost()
功能async
和await
为uploadImages()
功能。但是只有在所有图像都已解决/拒绝后,我才能解决/拒绝该功能?uploadImages()
就像是:
async function savePost() {
const result = await uploadImages();
// ACT BASED ON RESULT
}
但我不知道如何处理该uploadImages()
功能,以便仅在完成所有图像后解决/拒绝。
我怎样才能做到这一点?
解决方案
function uploadImages() {
const promises = images.map(async image =>
new Promise((resolve, reject) => {
const uploadTask = storageRef.put(file, metadata);
uploadTask.on('state_changed',
function progress() {
//UPLOAD PROGRESS BAR
},
function error(err) {
//SET ERROR
reject(err);
},
function complete() {
//UPDATE IMAGE URL IN BLOGPOST OBJECT
//SET COMPLETE
resolve();
}
);
})
);
return Promise.all(promises);
}
推荐阅读
- android - 如何创建大型离线数据存储库 Android 应用程序?
- c# - Godot C#“来自信号的错误调用方法”
- ruby-on-rails - 如何在 Ruby CSV 中导入数据之前检查标头是否存在?
- html - 如何将图像的背景颜色设置为黑色?
- c# - 如何仅在 Google 表格中为特定单元格更新前景色
- api - Rails 6:版本控制 API 时没有方法错误
- javascript - 调用节点模块中的类中的函数时获取“无法读取未定义的属性”
- bash - Gitlab-CI CE 执行器 /usr/bin/bash:第 113 行:git:找不到命令
- ksh - KSH - 在参数扩展中请求“\n”替换的示例
- sql - 过滤行以返回确切的关系