有没有更简洁的方法来解决或拒绝在forEach循环中创建的Promises?

时间:2019-05-13 04:29:46

标签: javascript firebase promise es6-promise

我想从 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);
});

想法是:

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

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

1 个答案:

答案 0 :(得分:2)

不,代码几乎可以得到,但是由于您做的最后一件事返回一个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,但没有地图方法)