reactjs - 将多张图片上传到 firebase,然后将图片 url 保存到 firestore
问题描述
有人可以帮助我修改代码,以便等待上传完成然后将图片网址保存到 Firestore?我是异步和等待的新手,似乎无法弄清楚。fileDownloadUrl
即使我在里面保存到firestore,它仍然是空的Promise.all(promises).then()
:
cxonst promises = [];
const fileDownloadUrl = [];
pictures.forEach(file => {
const uploadTask =
firebase
.storage()
.ref()
.child(`img/upl/${file.data.name}`)
.put(file.uploadTask);
promises.push(uploadTask);
uploadTask.on(
firebase.storage.TaskEvent.STATE_CHANGED,
snapshot => {
const progress = Math.round((snapshot.bytesTransferred /
snapshot.totalBytes) * 100);
if (snapshot.state === firebase.storage.TaskState.RUNNING) {
console.log(`Progress: ${progress}%`);
}
},
error => console.log(error.code),
async () => {
const downloadURL = await
uploadTask.snapshot.ref.getDownloadURL();
fileDownloadUrl.push(downloadURL);
}
);
});
Promise.all(promises)
.then(() => {
db
.collection("properties")
.add({
timestamp: firebase.firestore.FieldValue.serverTimestamp(),
title: title,
description: description,
pictures: fileDownloadUrl,
user: user.uid
})
})
.catch(err => console.log(err));
解决方案
在等待put
调用的承诺完成时,您将使用uploadTask.on()
来确定下载 URL。由于这on
不是承诺的一部分,因此不能保证它们是同步的。
一个更简单且可行的方法应该是:
const promises = pictures.map(file => {
const ref = firebase.storage().ref().child(`img/upl/${file.data.name}`);
return ref
.put(file.uploadTask)
.then(() => ref.getDownloadURL())
});
Promise.all(promises)
.then((fileDownloadUrls) => {
db
.collection("properties")
.add({
timestamp: firebase.firestore.FieldValue.serverTimestamp(),
title: title,
description: description,
pictures: fileDownloadUrls,
user: user.uid
})
})
.catch(err => console.log(err));
推荐阅读
- python - 如何从其他脚本设置计划任务?(纯python中的kivy)
- python - 如何提高这个列表理解,需要返回第 N 个偶数,我需要偶数的列表或字典吗?
- razor - RazorEngineCore - 如何使用扩展方法
- python - 根据数据帧内的值将熊猫数据帧值与 rgb 颜色值的键对应
- laravel - laravel:不显示传递的数据
- amazon-web-services - 如何将 AWS::ECS::Service 更新为 Fargate 启动类型
- python - post_save 信号后无法运行自定义装饰器
- reactjs - 如何导航到一个组件并将其作为整个页面打开
- python - 逗号后如何匹配多个IP地址?
- javascript - 如何从 JSON 对象返回特定数量的单词?