我正在尝试从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
}
是否有其他解决方案? 谢谢。
答案 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;
})
希望它可以解决您的问题