Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有嵌套Firebase查询的For循环Javascript_Javascript_Firebase_Firebase Realtime Database - Fatal编程技术网

带有嵌套Firebase查询的For循环Javascript

带有嵌套Firebase查询的For循环Javascript,javascript,firebase,firebase-realtime-database,Javascript,Firebase,Firebase Realtime Database,我有一个包含用户列表的节点和第二个包含每个用户评级信息的节点。 我希望在第一个节点的用户中循环,并从第二个节点获得每个节点的评级。问题是循环不会等待第二个节点给出答案,因此返回的数组总是空的。 我知道我需要使用wait/async方法,但它不起作用。 谢谢你的帮助 return admin.database().ref('/user').once('value').then(async(snap) => { for(const userId of snap) { admin.dat

我有一个包含用户列表的节点和第二个包含每个用户评级信息的节点。 我希望在第一个节点的用户中循环,并从第二个节点获得每个节点的评级。问题是循环不会等待第二个节点给出答案,因此返回的数组总是空的。 我知道我需要使用wait/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);
});
您需要使用,如下所示(未经测试):



正如
Promise.all()
doc中所解释的,“返回的值将按照传递的承诺的顺序排列,而不管完成顺序如何”。因此,对于
userid
snap2
数组,它们的元素顺序是对应的:因此可以执行
array.push([userid[idx],rating])

谢谢你的工作!使用async/await是否可以获得相同的结果?是的,这是可能的,但是使用
async/await
forEach
并不简单,请参阅。
  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) => {
      //...
    });