从 Firebase 存储中获取 Url 照片时等待新的承诺不起作用
Await New Promise Not Working When Getting Url Photo From Firebase Storage
我想从 firebase 存储中获取联系人数据,然后从 firestore 存储中获取联系人照片。
get_contact = async () => {
let contacts = [];
let campaignsRef = await firestore().collection('users').doc(global.iduser).collection("contacts").get();
for (let campaign of campaignsRef.docs) {
let tasksRef = firestore().collection('users').doc(campaign.data().uid).get();
await tasksRef
.then(DocumentSnapshot => {
let data = DocumentSnapshot.data();
let photo = new Promise((resolve, reject) => {
storage()
.refFromURL('gs://think-ce51b.appspot.com/profiledefault.jpg')
.getDownloadURL()
.then(url => {
resolve(url);
})
.catch(error => {
return reject(error);
});
});
console.log(photo);
contacts.push({
'key': data.uid,
'fullname': data.fullname,
'profilephoto': photo,
});
})
.catch(error => {
setInitializing(false);
});
}
setdataContacts(contacts);
setInitializing(false);}
我可以从 DocumenSnapshot 获取数据联系人。但是当我想从 firebase 存储中获取 url 时,照片 return null/{"_U": 0, "_V": 0, "_W": null, "_X": null}。我认为可变照片中的新承诺无法正常运行。
如何在照片获取后才能推送到联系人url?
你的代码有不少问题。我很快发现的那些:
getDownloadURL
方法已经 returns 一个 promise,因此您无需创建自己的方法。
- 您不应在代码中混用
await
和 then
。除非您非常清楚自己在做什么,否则最好坚持使用其中之一。
如果我们在您的代码中解决这两个问题,我们最终会得到:
get_contact = async () => {
let contacts = [];
let campaignsRef = await firestore().collection('users').doc(global.iduser).collection("contacts").get();
for (let campaign of campaignsRef.docs) {
let tasksDoc = await firestore().collection('users').doc(campaign.data().uid).get();
let data = tasksDoc.data();
let url = await storage()
.refFromURL('gs://think-ce51b.appspot.com/profiledefault.jpg')
.getDownloadURL()
contacts.push({
'key': data.uid,
'fullname': data.fullname,
'profilephoto': photo,
});
}
setdataContacts(contacts);
setInitializing(false);
}
代码可能还有更多问题,但这是一个很好的起点。
我想从 firebase 存储中获取联系人数据,然后从 firestore 存储中获取联系人照片。
get_contact = async () => {
let contacts = [];
let campaignsRef = await firestore().collection('users').doc(global.iduser).collection("contacts").get();
for (let campaign of campaignsRef.docs) {
let tasksRef = firestore().collection('users').doc(campaign.data().uid).get();
await tasksRef
.then(DocumentSnapshot => {
let data = DocumentSnapshot.data();
let photo = new Promise((resolve, reject) => {
storage()
.refFromURL('gs://think-ce51b.appspot.com/profiledefault.jpg')
.getDownloadURL()
.then(url => {
resolve(url);
})
.catch(error => {
return reject(error);
});
});
console.log(photo);
contacts.push({
'key': data.uid,
'fullname': data.fullname,
'profilephoto': photo,
});
})
.catch(error => {
setInitializing(false);
});
}
setdataContacts(contacts);
setInitializing(false);}
我可以从 DocumenSnapshot 获取数据联系人。但是当我想从 firebase 存储中获取 url 时,照片 return null/{"_U": 0, "_V": 0, "_W": null, "_X": null}。我认为可变照片中的新承诺无法正常运行。
如何在照片获取后才能推送到联系人url?
你的代码有不少问题。我很快发现的那些:
getDownloadURL
方法已经 returns 一个 promise,因此您无需创建自己的方法。- 您不应在代码中混用
await
和then
。除非您非常清楚自己在做什么,否则最好坚持使用其中之一。
如果我们在您的代码中解决这两个问题,我们最终会得到:
get_contact = async () => {
let contacts = [];
let campaignsRef = await firestore().collection('users').doc(global.iduser).collection("contacts").get();
for (let campaign of campaignsRef.docs) {
let tasksDoc = await firestore().collection('users').doc(campaign.data().uid).get();
let data = tasksDoc.data();
let url = await storage()
.refFromURL('gs://think-ce51b.appspot.com/profiledefault.jpg')
.getDownloadURL()
contacts.push({
'key': data.uid,
'fullname': data.fullname,
'profilephoto': photo,
});
}
setdataContacts(contacts);
setInitializing(false);
}
代码可能还有更多问题,但这是一个很好的起点。