从 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?

你的代码有不少问题。我很快发现的那些:

  1. getDownloadURL 方法已经 returns 一个 promise,因此您无需创建自己的方法。
  2. 您不应在代码中混用 awaitthen。除非您非常清楚自己在做什么,否则最好坚持使用其中之一。

如果我们在您的代码中解决这两个问题,我们最终会得到:

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);
}

代码可能还有更多问题,但这是一个很好的起点。