Firebase 查询函数 returns 未定义
Firebase query function returns undefined
我想写一个 returns 对象的查询函数。问题是,在我的例子中,函数 returns 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
问题是 Firebase 使用异步侦听器来引用数据库,因此您不能 return 从回调中。
您可以将 return 对象存储到回调中的字典中。
我会答应的。
var filterDataAccordingToDate = function (ref, startTime, endTime) {
var filterDataAccordingToDatePromise = new Promise( function(resolve, reject) {
ref.orderByChild('date').startAt(startTime).endAt(endTime).once('value', function(snap) {
filteredObj = snap.val();
resolve(filteredObj);
});
});
return filterDataAccordingToDatePromise;
};
filterDataAccordingToDate(travelRef, 1466439004, 1466439011).then(function(result){
//this callback will be trigger when firebase call finish.
//result is what you set on the resolve.
console.log("DATA RETURNED: " + util.inspect(result, false, null));
});
如 Ami 所述,您不能 return 异步调用的结果。
您可以做的是使用一种方法处理您的结果,并直接调用您的异步调用而不期望 return 结果:
var filterDataAccordingToDate = function (ref, startTime, endTime) {
ref.orderByChild('date').startAt(startTime).endAt(endTime)
.once('value', function(snap) {
var filteredObj = snap.val();
console.log(util.inspect(filterDataAccordingToDate(filteredObj, false, null));
doSomethingWith(filteredObj);
});
}
function doSomethingWith(obj) {
console.log("DATA RETURNED: " + util.inspect(obj, false, null));
}
filterDataAccordingToDate(travelRef, 1466439004, 1466439011);
我想这完全取决于您想对数据做什么以及您希望引用它的次数。
注意:我确实建议将你的脚本放在一个独立的函数中,以避免添加私有函数(特定于单个功能),这样你就不会污染你的全局命名空间。
Ben Alman wrote a nice post about Immediately-Invoked Function Expressions (IIFE) or you can make use of a JavaScript namespace.
编辑: 由于adolfosrs suggests, you can also use promises but keep in mind what browsers您希望支持。
我想写一个 returns 对象的查询函数。问题是,在我的例子中,函数 returns 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
问题是 Firebase 使用异步侦听器来引用数据库,因此您不能 return 从回调中。
您可以将 return 对象存储到回调中的字典中。
我会答应的。
var filterDataAccordingToDate = function (ref, startTime, endTime) {
var filterDataAccordingToDatePromise = new Promise( function(resolve, reject) {
ref.orderByChild('date').startAt(startTime).endAt(endTime).once('value', function(snap) {
filteredObj = snap.val();
resolve(filteredObj);
});
});
return filterDataAccordingToDatePromise;
};
filterDataAccordingToDate(travelRef, 1466439004, 1466439011).then(function(result){
//this callback will be trigger when firebase call finish.
//result is what you set on the resolve.
console.log("DATA RETURNED: " + util.inspect(result, false, null));
});
如 Ami 所述,您不能 return 异步调用的结果。
您可以做的是使用一种方法处理您的结果,并直接调用您的异步调用而不期望 return 结果:
var filterDataAccordingToDate = function (ref, startTime, endTime) {
ref.orderByChild('date').startAt(startTime).endAt(endTime)
.once('value', function(snap) {
var filteredObj = snap.val();
console.log(util.inspect(filterDataAccordingToDate(filteredObj, false, null));
doSomethingWith(filteredObj);
});
}
function doSomethingWith(obj) {
console.log("DATA RETURNED: " + util.inspect(obj, false, null));
}
filterDataAccordingToDate(travelRef, 1466439004, 1466439011);
我想这完全取决于您想对数据做什么以及您希望引用它的次数。
注意:我确实建议将你的脚本放在一个独立的函数中,以避免添加私有函数(特定于单个功能),这样你就不会污染你的全局命名空间。 Ben Alman wrote a nice post about Immediately-Invoked Function Expressions (IIFE) or you can make use of a JavaScript namespace.
编辑: 由于adolfosrs suggests, you can also use promises but keep in mind what browsers您希望支持。