我想编写一个返回对象的查询函数。问题是,在我的情况下,函数返回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
答案 0 :(得分:4)
如Ami所述,您无法从异步调用中返回结果。
您可以做的是使用方法处理结果,只需直接调用异步调用而不需要返回结果:
ele.click(function () {
alert('Hello World!')
});
我想这完全取决于您想要对数据做什么以及您希望引用它的次数。
注意:我建议您将脚本放在一个独立的函数中,以避免添加私有函数(特定于单个功能),这样您就不会污染全局命名空间。 Ben Alman写了一篇关于立即调用函数表达式(IIFE)的好帖子,或者你可以使用JavaScript namespace。
答案 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使用异步侦听器来访问数据库,因此无法从回调中返回。
您可以将回传对象存储在回调中的字典中。