如何在Firebase中使用in循环和查询数据

时间:2019-05-31 10:13:01

标签: javascript firebase firebase-realtime-database

我有一个查询,该查询获取Firebase数据库中用户的所有密钥。这些密钥被保存到数组中。然后,我想遍历数组并在循环查询中查询用户名。问题是它在加载名字时停止了-即使数组中有1000个键,循环也无法查询通过?

var i;

for (i = 0; i < emailArray.length; i++) { 
    userIDgotten = emailArray[i];

    console.log(userIDgotten);

    return firebase.database().ref('/users/' + userIDgotten).once('value').then(function(snapshotUser) {
        const name = snapshotUser.val().name;

        console.log("NAME: " + name);

        allTicketEmailsFromUsers = allTicketEmailsFromUsers + ", " + name;

        console.log(allTicketEmailsFromUsers);
    });
}

我没有收到任何错误,但是检索名字之后循环就停止了。

2 个答案:

答案 0 :(得分:1)

您在循环中使用return,这将停止循环。
如果删除该退货,它将以您期望的方式工作。

for (var i = 0; i < emailArray.length; i++) { 
    userIDgotten = emailArray[i];

    console.log(userIDgotten);

    firebase.database().ref('/users/' + userIDgotten).once('value').then(function(snapshotUser) {
        const name = snapshotUser.val().name;

        console.log("NAME: " + name);

        allTicketEmailsFromUsers = allTicketEmailsFromUsers + ", " + name;

        console.log(allTicketEmailsFromUsers);
    });
}

答案 1 :(得分:1)

once()方法是异步的,并返回Promise。

由于您要使用once() 并行执行进行多个查询,因此需要使用Promise.all(),如下所示:

var promises = [];
for (var i = 0; i < emailArray.length; i++) { 
   userIDgotten = emailArray[i];

   console.log(userIDgotten);

   promises.push(firebase.database().ref('/users/' + userIDgotten).once('value'));

}

Promise.all(promises)
.then(function(results) {
    var allTicketEmailsFromUsers = "";
    results.forEach(function(snapshotUser) {
        const name = snapshotUser.val().name;
        console.log("NAME: " + name);
        allTicketEmailsFromUsers = allTicketEmailsFromUsers + ", " + name;
    });
    console.log(allTicketEmailsFromUsers);
}