我正在使用Firebase进行一些项目,并且非常喜欢这个平台。
我偶然发现了一件我不能做的事情,并且想知道是否有任何方法可以实现它,或者是否有另一种方法可以实现它。
我要做的是创建一个函数来从我的Firebase数据库中检索最后X个条目并将数据返回给调用函数。
这样的事情:
function getTwoLatestLocations()
{
var twoLocations;
myFirebaseRef.limitToLast(2).once('value', function (dataSnapshot) {
twoLocations = dataSnapshot.val();
}, function (errorObject) {
// code to handle read error
console.log("The read failed: " + errorObject.code);
});
return twoLocations;
}
然后这样称呼它:
function someCalcutationsWithTheTwoLastLocations()
{
var twoLastLocations = getTwoLatestLocations();
// Do some calculations
}
但是您可能已经猜到了对数据库引用的调用是异步的,因此返回的对象将始终未定义。
有没有办法优雅地做到这一点,所以我可以把方法分开?
P.S。目前我的所有代码都只是在对数据库的调用中。难看。
答案 0 :(得分:7)
要将代码分开,您可以传入回调:
function getTwoLatestLocations(callback)
{
var twoLocations;
myFirebaseRef.limitToLast(2).once('value', function (dataSnapshot) {
twoLocations = dataSnapshot.val();
callback(twoLocations);
}, function (errorObject) {
// code to handle read error
console.log("The read failed: " + errorObject.code);
});
}
然后这样称呼它:
function someCalcutationsWithTheTwoLastLocations()
{
getTwoLatestLocations(function(twoLocations) {
// Do some calculations
});
}
永远记住的重要一点是你不能等待异步加载的东西。
这已经涵盖了很多次,包括相关问题列表中的最佳答案:Handling Asynchronous Calls (Firebase) in functions