检索 Firebase 数据并返回它的最佳方法,或另一种方法

IT技术 javascript asynchronous firebase firebase-realtime-database
2021-01-27 03:47:50

我在一些项目中使用 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
}

但正如您可能已经猜到,对数据库引用的调用是异步的,因此返回的对象将始终是未定义的。

有没有办法优雅地做到这一点,这样我就可以将方法分开?

PS 目前我所有的代码都只是在对数据库的调用中。丑陋的。

1个回答

要将代码分离出来,您需要传入一个回调:

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
    });
}

要始终记住的重要一点是,您不能等待异步加载的内容。

这已经被涵盖了很多次,包括在相关问题列表的最佳答案中:处理函数中的异步调用(Firebase)

如果我的回答有用,请点赞。如果我的回答为您提供了您采用的解决方案,请接受它。我你选择了另一个解决方案,自我回答并接受那个。这在 StackOverflow 上是完全可以接受的。
2021-04-05 03:47:50
是的。这是两种选择之一。我选择了另一种选择。每次调用 on 方法时缓存我的快照。我想这只是一个偏好问题。我会将其标记为正确答案,因为您提到了一种可能性并提供了包含另一种可能性的链接。如果现在没有人回答,我自己会回答这个问题。谢谢。
2021-04-13 03:47:50