Javascript Firebase JS阵列失去作用域

Javascript Firebase JS阵列失去作用域,javascript,firebase,firebase-realtime-database,Javascript,Firebase,Firebase Realtime Database,Firebase数据如下所示 -users --demo1 ---conid:1 -election --election1 ---conRegex:1 --election2 ---conRegex:1 检索election1、election2的代码为 var conid; var conRegex; var electionArr = []; if(uidAnonymous != null) { db.ref('users/'+user).once

Firebase数据如下所示

-users
--demo1
---conid:1
-election
--election1
---conRegex:1
--election2
---conRegex:1
检索election1、election2的代码为

var conid;
    var conRegex;
    var electionArr = [];
    if(uidAnonymous != null) {
        db.ref('users/'+user).once('value', function(snapshot) {
            if(snapshot.exists()) {
                conid = snapshot.val().conid;
            }
        });
        db.ref('election/').once('value', function(snapshot) {
            snapshot.forEach(function(electionSnapshot) {
                conRegex = electionSnapshot.val().conRegex;
                if(conid.startsWith(conRegex)) {
                    electionArr.push(electionSnapshot.key.toString());
                }
            });
        });
        console.log(electionArr);
    }

问题是选举人是空的吗?如何解决该问题

Firebase函数调用是异步的。这就是它的工作原理,您不能在函数调用中从firebase
内部的范围外分配数组。使数组在
函数中可用一次(值)

var conid;
var conRegex;
if(uidAnonymous != null) {
    db.ref('users/'+user).once('value', function(snapshot) {
        if(snapshot.exists()) {
            conid = snapshot.val().conid;
        }
    });
    db.ref('election/').once('value', function(snapshot) {
        var electionArr = [];
        snapshot.forEach(function(electionSnapshot) {
            conRegex = electionSnapshot.val().conRegex;
            if(conid.startsWith(conRegex)) {
                Object.keys(electionSnapshot.val()).map(k => {
                    electionArr.push(electionSnapshot.val()[k]);
                })
            }
        });
        console.log(electionArr);
    });
}

Firebase函数调用是异步的。这就是它的工作原理,您不能在函数调用中从firebase
内部的范围外分配数组。使数组在
函数中可用一次(值)

var conid;
var conRegex;
if(uidAnonymous != null) {
    db.ref('users/'+user).once('value', function(snapshot) {
        if(snapshot.exists()) {
            conid = snapshot.val().conid;
        }
    });
    db.ref('election/').once('value', function(snapshot) {
        var electionArr = [];
        snapshot.forEach(function(electionSnapshot) {
            conRegex = electionSnapshot.val().conRegex;
            if(conid.startsWith(conRegex)) {
                Object.keys(electionSnapshot.val()).map(k => {
                    electionArr.push(electionSnapshot.val()[k]);
                })
            }
        });
        console.log(electionArr);
    });
}
once()
函数。读取所有数据时,您必须嵌套读取并将阵列记录到控制台:

var conid;
var conRegex;
var electionArr = [];
if(uidAnonymous != null) {
    db.ref('users/'+user).once('value', function(snapshot) {
        if(snapshot.exists()) {
            conid = snapshot.val().conid;

            db.ref('election/').once('value', function(snapshot) {
                snapshot.forEach(function(electionSnapshot) {
                    conRegex = electionSnapshot.val().conRegex;
                    if(conid.startsWith(conRegex)) {
                        electionArr.push(electionSnapshot.key.toString());
                    }
                });
                console.log(electionArr);
            });
        }
    });
}
once()
函数。读取所有数据时,您必须嵌套读取并将阵列记录到控制台:

var conid;
var conRegex;
var electionArr = [];
if(uidAnonymous != null) {
    db.ref('users/'+user).once('value', function(snapshot) {
        if(snapshot.exists()) {
            conid = snapshot.val().conid;

            db.ref('election/').once('value', function(snapshot) {
                snapshot.forEach(function(electionSnapshot) {
                    conRegex = electionSnapshot.val().conRegex;
                    if(conid.startsWith(conRegex)) {
                        electionArr.push(electionSnapshot.key.toString());
                    }
                });
                console.log(electionArr);
            });
        }
    });
}

我需要在if(uidAnonymous!=null)之外使用electionArr,那么我该怎么做呢?我已经编辑了代码。您需要映射返回的快照对象的键,并将值推送到Array。我已经编辑了代码。请告诉我数据现在是否进入electionArr,然后我们再试一次。因为我无法检查输出未获得预期结果,这就是SelectionSnapshot.key您所说的预期输出是什么意思。您是否在
electionSnapshot.val()
中获取了值。我需要在if(uidAnonymous!=null)之外使用electionArr,那么我将如何执行该操作?我已经编辑了代码。您需要映射返回的快照对象的键,并将值推送到Array。我已经编辑了代码。请告诉我数据现在是否进入electionArr,然后我们再试一次。因为我无法检查输出未获得预期结果,这就是SelectionSnapshot.key您所说的预期输出是什么意思。您甚至在
electionSnapshot.val()中获取值。