Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/433.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
Javascript 如何在父密钥请求的功能之外使用其结果_Javascript_Firebase - Fatal编程技术网

Javascript 如何在父密钥请求的功能之外使用其结果

Javascript 如何在父密钥请求的功能之外使用其结果,javascript,firebase,Javascript,Firebase,下面获取子节点的父密钥。 有没有一种方法可以将结果(父键)带到函数之外,比如全局变量或其他什么。 我希望能够调用一个返回父键的函数 这起作用(在控制台中返回parent.key) 这行不通 var test; firebase.auth().onAuthStateChanged(function(user){ var ref = firebase.database().ref('users'); ref.orderByChild('uid').equalTo(user.uid).

下面获取子节点的父密钥。 有没有一种方法可以将结果(父键)带到函数之外,比如全局变量或其他什么。 我希望能够调用一个返回父键的函数

这起作用(在控制台中返回parent.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);

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

考虑阅读以下内容,并使用承诺方法实现您的目标:


您还可以使用
async
await
,这基本上是一种隐藏
Promise
的方法

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

考虑阅读以下内容,并使用承诺方法实现您的目标:


您还可以使用
async
await
,这基本上是一种隐藏
Promise
的方法

以下方法应该有效

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])
    });
});

以下几点应该有效

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])
    });
});

谢谢@jonasdev,我会看看的Hanks@jonasdev,我会看看的