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您希望支持。