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

Is there a more concise way to resolve or reject Promises that are created in a forEach loop?

我想从 Firebase 实时数据库Firebase 存储 中读取数据。首先读取 RTDB。这是因为存储在 Firebase Storage 中的文件的名称是 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 数据中获取的键从存储中读取数据。数据读取成功后 Resolve Promise。否则拒绝。
  4. 创建所有 Promise 后,当所有 Promise 解析时,使用 someFunction 执行一些操作,这将更改创建的数据

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

不,代码是您所能得到的最简单的代码,但是,由于您所做的最后一件事是 returns 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 方法)