Firebase查询函数返回undefined

时间:2016-06-20 16:32:55

标签: javascript firebase firebase-realtime-database

我想编写一个返回对象的查询函数。问题是,在我的情况下,函数返回undefined

var filterDataAccordingToDate = function (ref, startTime, endTime) {

    var filteredObj = {};

    ref.orderByChild('date').startAt(startTime).endAt(endTime)
    .once('value', function(snap) {
       filteredObj = snap.val();

       console.log(util.inspect(filterDataAccordingToDate(filteredObj, false, null));
      //Returns the correct object

       return filteredObj;
    });  
}

console.log("DATA RETURNED: " + util.inspect(filterDataAccordingToDate(travelRef, 1466439004, 1466439011), false, null));
// DATA RETURNED: undefined

3 个答案:

答案 0 :(得分:4)

Ami所述,您无法从异步调用中返回结果。

您可以做的是使用方法处理结果,只需直接调用异步调用而不需要返回结果:

ele.click(function () {
   alert('Hello World!')
});

我想这完全取决于您想要对数据做什么以及您希望引用它的次数。

注意:我建议您将脚本放在一个独立的函数中,以避免添加私有函数(特定于单个功能),这样您就不会污染全局命名空间。 Ben Alman写了一篇关于立即调用函数表达式(IIFE)的好帖子,或者你可以使用JavaScript namespace

修改:正如adolfosrs建议的那样,您也可以使用promises,但请记住您希望支持的browsers

答案 1 :(得分:3)

我会选择承诺。

class atomic_property(property):

    def __init__(self, *args, **kwargs):
        #print(args,kwargs) #uncomment to see this be called again when using .setter !
        super(atomic_property,self).__init__(*args,**kwargs)       
        self.lock = threading.Lock()

    def __get__(self, obj, objtype=None):
        with self.lock:
            return super(atomic_property,self).__get__(obj,objtype)

    def __set__(self, obj, value):
        with self.lock:
            return super(atomic_property,self).__set__(obj,value)

答案 2 :(得分:2)

问题是Firebase使用异步侦听器来访问数据库,因此无法从回调中返回。

您可以将回传对象存储在回调中的字典中。