【问题标题】:For loop with nested Firebase queries Javascript带有嵌套 Firebase 查询 Javascript 的 For 循环
【发布时间】:2020-09-13 08:26:09
【问题描述】:

我有一个包含用户列表的节点和一个包含每个用户的评分信息的第二个节点。 我想在第一个节点的用户中循环,并为每个用户从第二个节点获得评分。问题是循环不会等待第二个节点给出答案,因此返回的数组总是空的。 我知道我需要使用 await/async 方法,但它不起作用。 感谢您的帮助

return admin.database().ref('/user').once('value').then(async(snap) => {
for(const userId of snap) {
    admin.database().ref('/rating/' + userId.key).once('value').then(await (snap) =>{
        var rating = snap.val();
        array.push([userId.key, rating]);
    }).catch(error => {
        console.log("failed 1 " + error.code);
    });
}
return array;
}).catch(error => {
console.log("failed 2 " + error.code);
});

【问题讨论】:

    标签: javascript firebase firebase-realtime-database


    【解决方案1】:

    需要使用Promise.all(),如下(未测试):

      const array = [];
      const userIds = [];
      return admin
        .database()
        .ref('/user')
        .once('value')
        .then((snap1) => {
          const promises = [];
          snap1.forEach((childSnapshot1) => {
            promises.push(
              admin
                .database()
                .ref('/rating/' + childSnapshot1.key)
                .once('value')
            );
            userIds.push(childSnapshot1.key);
          });
          return Promise.all(promises);
        })
        .then((snap2) => {
          snap2.forEach((childSnapshot2, idx) => {
            const rating = childSnapshot2.val();
            array.push([userIds[idx], rating]);
          });
          return array;
        })
        .catch((error) => {
          //...
        });
    

    正如Promise.all() 文档中所解释的,“返回值将按照 Promises 传递的顺序排列,而不管完成顺序如何”。所以对于userIdssnap2 数组,它们的元素顺序是对应的:因此你可以这样做array.push([userIds[idx], rating]);

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-21
    • 2020-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多