我如何在其功能之外使用父键请求的结果

时间:2018-12-07 08:49:46

标签: javascript firebase

以下内容使我获得了子节点的父键。 有没有办法将结果(父键)带到函数之外,例如全局变量之类。 我希望能够调用一个返回父键的函数

这有效(返回控制台中的parent.key)

firebase.auth().onAuthStateChanged(function(user){
    var ref = firebase.database().ref('users');
    ref.orderByChild('uid').equalTo(user.uid).on("value", function(snapshot) {
        snapshot.forEach((function(child) { console.log(child.key) }));
    });
});

这不起作用

var test;
firebase.auth().onAuthStateChanged(function(user){
    var ref = firebase.database().ref('users');
    ref.orderByChild('uid').equalTo(user.uid).on("value", function(snapshot) {
        snapshot.forEach((function(child) { test = child.key }));
    });
});
console.log(test);

2 个答案:

答案 0 :(得分:1)

测试变量确实在函数内部分配。问题在于从数据库中获取的on()方法是异步。这意味着console.log()语句将在分配测试变量之前执行。

考虑阅读,并使用promise方法来实现您想要的:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Using_promises

您还可以使用asyncawait,这基本上是隐藏Promise的一种方式。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function

答案 1 :(得分:1)

以下应该可以工作

function f_returnUserDetails(a){
    var key;
    var childData;
    return new Promise(function(resolve, reject) { 
        firebase.database().ref('/users/').orderByChild("uid").equalTo(a).on('value', function (snapshot) {
            snapshot.forEach(function(childSnapshot) {
                key = childSnapshot.key;
                childData = childSnapshot.val();
                resolve([childData, childSnapshot.key]);
            });
        });
    });
};


firebase.auth().onAuthStateChanged(function(user){
    var user = firebase.auth().currentUser;
    var uid = user.uid;
    f_returnUserDetails(uid).then((dbItems) => {
        console.log(dbItems[1])
    });
});