不要在forEach语句

时间:2018-03-05 09:15:35

标签: javascript firebase firebase-realtime-database

我有一个对象:

enter image description here

这是我用来遍历对象的函数:

function getAllUsersKeys(user){

    var promise = new Promise((resolve, reject) => {
    var tokens = []

    user.forEach(function(user) {
            admin.database().ref(`/FAVORITES/${user.key}`).orderByKey().once('value').then((favShops) => {
            favShops.forEach((shop)=>{
                if(shop.key==saledata.store_id){    //if store that activated sale if found under users list under /FAVORITES

                    admin.database().ref(`/FAVORITES/${user.key}/token`).orderByKey().once('value').then((token) => {
                        //console.log(token.val().id);
                        tokens.push(token.val().id);                
                    })
                }
            })
        })
    })
    resolve(tokens);
    })

    return promise;
}

控制台消息将在所选令牌下打印出“id”。

//console.log(token.val().id);

但是当我将这个“id”推入名为 tokens 的数组时,没有任何内容出现。

tokens.push(token.val().id);

基本上我想要这个方法做的是返回一个具有选定数量“id”的数组。

请帮我优化我的代码。现在它返回一个空数组。

1 个答案:

答案 0 :(得分:1)

问题是您在解决firebase承诺之前解决了getAllUserKeys的承诺。您的console.log工作原因是因为它等待您在记录之前完成firebase查找。当你resolve(tokens)时,填补该数组的承诺尚未得到解决。

您需要确保在resolve(tokens)之前解决了所有firebase承诺。

更新:

我不能轻易测试,所以它可能不会先尝试。

function getAllUserKeys(user) {
  return Promise.all(user.map(user => {
    return admin.database().ref(`/FAVORITES/${user.key}`).orderByKey().once('value');
  })).then(favShops => {
    return Promise.all(favShops.filter(shop => {
      if(shop.key === saledata.store_id) { 
        return admin.database().ref(`/FAVORITES/${user.key}/token`).orderByKey().once('value');
      }
      return false;
    }))
  }).then(tokens => {
    return tokens.map(token.val().id);
  })
}

这是一个如何链接承诺的例子。

  1. 将一组用户转换为来自firebase的promises数组,这将解析为favShops。
  2. then方法中,您将获得promise all的结果,该结果应该是favShops数组。
  3. 选择favShops并过滤掉与saledata.store_id匹配的商店,返回将由firebase api解析的承诺。
  4. 一旦所有过滤后的商店承诺得到解决,您将获取令牌数组并将其转换为一系列ID。
  5. 使用getAllUserKeys().then(tokens => {}),其中标记应为ids数组。