Javascript 如何从Firebase快照返回阵列

Javascript 如何从Firebase快照返回阵列,javascript,node.js,firebase,Javascript,Node.js,Firebase,我正试图从Firebase中检索一些数据(这非常有效),但我的同事需要我将快照的值作为数组返回,以便他可以在另一个文件中使用它。 据我所知,不可能知道值事件是异步的 下面是一个例子: function getData() { let current = []; qRef.on("value", function (snapshot) { //qRef is the reference to my DB current = snapshot.val(); }, function (erro

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

下面是一个例子:

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
}
有没有其他解决办法?
谢谢。

你说得对,你不能直接返回值,因为它是异步的

相反,你应该利用承诺:

function getData() {
  return qRef
    .once('value')
    .then(snapshot => snapshot.val())
    .then(value => [ value ])
}

请注意,我使用的是
.once()
而不是
.on()
.on()
用于侦听更改,
.once()
仅用于按需检索值。另外,
.on()
不使用承诺,因为承诺意味着“将发生一些异步工作,然后您将得到一个结果”。侦听某个值可能意味着回调被触发多次。

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

相反,你应该利用承诺:

function getData() {
  return qRef
    .once('value')
    .then(snapshot => snapshot.val())
    .then(value => [ value ])
}

请注意,我使用的是
.once()
而不是
.on()
.on()
用于侦听更改,
.once()
仅用于按需检索值。另外,
.on()
不使用承诺,因为承诺意味着“将发生一些异步工作,然后您将得到一个结果”。侦听某个值可能意味着回调会被触发多次。

如果不是快照,请假设使用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;
})

希望它能解决您的问题

如果它不是快照,假设是一个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;
})

希望它能解决您的问题

在value事件中,它会按我的要求返回数据。。但是在return语句中,我只有一个空数组,这是正常的,因为它是在异步事件之前执行的。return
snapshot.val()
在value函数中,在value事件中,它返回我想要的数据。。但是在return语句中,我只有一个空数组,这是正常的,因为它是在异步事件之前执行的!我只有一个问题,若我想返回一个经过编辑的快照数组,我可以在哪里添加它?(因为我实际上需要10个无序的快照值)第二个
中的函数。然后
获取值,并将其粘贴到数组中。您可以在该函数中对快照值执行任何操作。您好,我是firebase+nodejs的新手。为什么我在console.log(getData())时;它的回报承诺{}。有什么建议吗?非常感谢它的工作!我只有一个问题,若我想返回一个经过编辑的快照数组,我可以在哪里添加它?(因为我实际上需要10个无序的快照值)第二个
中的函数。然后
获取值,并将其粘贴到数组中。您可以在该函数中对快照值执行任何操作。您好,我是firebase+nodejs的新手。为什么我在console.log(getData())时;它的回报承诺{}。有什么建议吗?太好了!谢谢,太好了!谢谢