我想从Firebase实时数据库和Firebase存储中读取数据。首先读取RTDB。这是因为存储在Firebase存储中的文件名是RDTB中数据的键。我有以下代码:

let newReadRef = firebase.database().ref('someRef').limitToLast(3).once('value').then(snapshot => {
  let promiseArray = [];
  snapshot.forEach(e => {
    promiseArray.push(new Promise((resolve, reject) => {
      //Do all the things I need to do before trying to get data from my Firebase Storage

      let filePathRef = firebase.storage().ref(e.val().key);
      filePathRef.getDownloadURL().then(url => {
        //Do something with the url
        resolve('Promise resolved');
      }).catch(e => {
        console.log(e);
        reject('Rejected');
      });
    }));
  });

  Promise.all(promiseArray).then(someFunction);
});


这个想法是:


从我的RTDB检索一些数据,稍后将使用其密钥在Firebase存储中检索数据
为我的RTDB中读取的每个数据创建一个新的Promise
对于每个创建的Promise,使用从RTDB数据获得的密钥从存储中读取数据。成功读取数据后,解决Promise。否则,拒绝。
在创建所有Promise之后,当所有Promise都解决后,使用someFunction进行某些操作,这将更改创建的数据


看来我的代码有点嵌套。有没有更好的方法来实现上述目标?

最佳答案

不,代码几乎可以得到,但是由于您做的最后一件事返回了Promise,因此您无需创建Promise

snapshot.forEach(e => {
    //Do all the things I need to do before trying to get data from my Firebase Storage
    let filePathRef = firebase.storage().ref(e.val().key);
    promiseArray.push(
        filePathRef.getDownloadURL()
        .then(url => {
            //Do something with the url
            return 'Promise resolved';
        }).catch(e => {
            console.log(e);
            throw 'Rejected';
        });
    );
});


我本来建议使用.map代替.forEach,但是如果我记得,snapshot不是Javascript数组(它具有forEach,但没有map方法)

09-30 16:13
查看更多