如何从Firebase快照返回数组

时间:2018-08-11 18:20:42

标签: javascript node.js firebase

我正在尝试从Firebase检索一些数据(效果很好),但是我的同事需要我将快照的值作为数组返回,以便他可以在另一个文件中使用它。 据我所知,不可能知道value事件是异步

这是一个例子:

function getData() {
let current = [];
qRef.on("value", function (snapshot) { //qRef is the reference to my DB
    current = snapshot.val();
}, function (errorObject) {
    console.log("The read failed: " + errorObject.code);
});
return current; //expected value is the returned data from the snapshot
}

是否有其他解决方案? 谢谢。

2 个答案:

答案 0 :(得分:3)

是的,您不能直接返回值,因为它是异步的。

相反,您应该使用Promises:

    ((AppCompatActivity) context).getSupportFragmentManager()

请注意,我使用的是function getData() { return qRef .once('value') .then(snapshot => snapshot.val()) .then(value => [ value ]) } 而不是.once().on()用于侦听更改,.on()仅用于按需获取值。另外,.once()不使用promise,因为promise意味着“将发生一些异步工作,然后您将获得结果”。监听值可能意味着回调被多次触发。

答案 1 :(得分:0)

如果它不是一个快照,假设有一个get函数,那么您可以使用它:-

function getData() {
    return new Promise(function(resolve, reject){
        let current = [];
        qRef.on("value", function (snapshot) { //qRef is the reference to my DB
            current = snapshot.val();
            resolve(current);
        }, function (errorObject) {
            console.log("The read failed: " + errorObject.code);
            reject({
                error: true
            })
        });

    })
}

称呼

getData.then(function(current){
    desired_variable = current
})

因为它是快照,所以您可以传递callbak函数并每次调用它。 回调函数会将数据设置为所需的变量

 function getData(callback) {
    let current = [];
    qRef.on("value", function (snapshot) { //qRef is the reference to my DB
        current = snapshot.val();
        // write logic for current array
        callback(current);
    }, function (errorObject) {
        console.log("The read failed: " + errorObject.code);
        reject({
            error: true
        })
    });
}

它将被称为

getData(function(current){
       desired_variable = current;
})

希望它可以解决您的问题