不要在forEach语句中推送元素

问题描述 投票:0回答:1

我有一个对象:

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”的数组。

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

javascript firebase firebase-realtime-database
1个回答
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 => {}),其中标记应该是一组id。
© www.soinside.com 2019 - 2024. All rights reserved.