2016-01-20 20 views
1

我正在为某些项目使用Firebase,并且很喜欢这个平台。检索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.目前我所有的代码都只是在调用数据库的时候。丑陋。

回答

4

对代码进行分离,你会传递一个回调:

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

+0

是。这是两种选择之一。 我选择了其他选项。每次调用on方法时要缓存我的快照。 我想这只是一个偏好问题。自从您提到一种可能性并提供包含另一种可能性的链接以后,我会将其标记为正确答案。 如果现在没有人会回答,我自己会回答。谢谢。 – Sigmundur

+0

如果我的答案是有用的,upvote它。如果我的回答为您提供了解决方案,请接受它。我选择了另一种解决方案,自我回答并接受这个解决方案。这在StackOverflow上完全可以接受。 –

相关问题