Javascript 如何从Firebase快照返回阵列
我正试图从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
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())时;它的回报承诺{}。有什么建议吗?太好了!谢谢,太好了!谢谢