代码之家  ›  专栏  ›  技术社区  ›  robe007 Leo Aguirre

递归Promise.all,在firebase中有快照

  •  0
  • robe007 Leo Aguirre  · 技术社区  · 7 年前

    我的firebase数据库上有以下结构:

    enter image description here

    pin . 为此,我使用这样的递归函数:

    let pins = [];
    
    const normalize = (snapchot) => {
      snapchot.forEach(function(child) {
        if(child.val().pin) {
          pins.push(Promise.resolve(child.val().pin));
        }
        else normalize(child);
      });
      return Promise.all(pins);
    }
    

    normalize 功能:

    normalize(snapshot) // snapshot represents the data from the firebase db
      .then(p => {
        console.log(p); // [ 'mi-pin-agosto', 'mi-pin-julio' ]
      })
      .catch(err => {
        // handle error
      })
    

    它可以工作,但是当我调试代码时,我看到 return Promise.all(pins); 被多次调用。我只需要打一次电话 foreach 已经完全完成了;这是关于性能的想法,因为 snapshot 数据它比我在图片中看到的要大。

    有什么想法吗???

    1 回复  |  直到 7 年前
        1
  •  2
  •   Jaromanda X    7 年前

    只使用 Promise.all 一旦你能拥有 递归的

    const normalize = (snapshot) => {
        const process = x => {
            let ret = [];
            x.forEach(function(child) {
                if(child.val().pin) {
                    ret.push(Promise.resolve(child.val().pin));
                } else {
                    ret = ret.concat(process(child));
                }
            });
            return ret;
        });
        return Promise.all(process(snapshot));
    }
    

    此代码也不需要 global 存储结果的数组

    但是,因为没有 asynchronous normalize

    const normalize = (snapshot) => {
        let ret = [];
        snapshot.forEach(function(child) {
            if(child.val().pin) {
                ret.push(child.val().pin);
            } else {
                ret = ret.concat(normalize(child));
            }
        });
        return ret;
    };
    

    如果您真的要对这段代码使用Promises,您可以简单地

    Promise.all(normalize(snapshot))
    .then(p => {
        console.log(p); // [ 'mi-pin-agosto', 'mi-pin-julio' ]
     })
    .catch(err => {
        // handle error
    })
    
    推荐文章