如何在JavaScript中的Firebase get函数中返回内部函数的值?

时间:2018-01-31 05:18:46

标签: javascript firebase asynchronous firebase-realtime-database callback

我有这个函数是javascript,我希望从我存储在我的firebase数据库中的数据构造一个数组。很明显,正在正确创建数组(通过使用console.log语句),但是我无法将数组放在函数之外。到目前为止,这就是我所拥有的:

// my function
function foo(){
    firebase.database().ref("data").once('value').then(function(snapshot){
        var list = snapshot.val();
        var newlist = [];
        for(var item in list){
            newlist.push(
                {axis:"x-axis", value:list[item].info, definition: list[item].def},
                {axis:"y-axis", value:list[item].info, definition: list[item].def},
                {axis:"z-axis", value:list[item].info, definition: list[item].def},
            );
        }
        return newlist;
    })
}

// my creation
var fooList = foo();

// my test
setTimeout(function(){
    console.log(fooList); // returns undefined...
},5000);

每当我运行此函数时,我总会得到一个未定义的元素。 我真的很感激你的帮助!

1 个答案:

答案 0 :(得分:0)

您可以从Promise函数返回foo并使用await在其他地方获取结果,或者您可以在返回的承诺上使用then这是一个更好的解决方案

结帐代码

function foo(){
    return new Promise(function(resolve , reject){
        firebase.database().ref("data").once('value').then(function(snapshot)
        {
            var list = snapshot.val();
            var newlist = [];
            for(var item in list){
                newlist.push(
                    {axis:"x-axis", value:list[item].info, definition: list[item].def},
                    {axis:"y-axis", value:list[item].info, definition: list[item].def},
                    {axis:"z-axis", value:list[item].info, definition: list[item].def},
                );
            }

            resolve(newlist);
        });
    })
}

//or without await
foo().then(function(list){
    console.log('using then , '  , list);
})

var fooList = await foo();

// my test
setTimeout(function(){
    console.log('in setTimeout' , fooList); 
},5000);

console.log('without setTimeout' , fooList);